web-dev-qa-db-fra.com

erreur LNK2019: symbole externe non résolu _main référencé dans la fonction ___tmainCRTStartup

Je ne sais pas ce qui ne va pas. Je ne trouve pas où est l'erreur, commenter l'implémentation ne résout pas l'erreur non plus.

fichier d'en-tête

#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H
#include <cstdlib>  // Provides size_t

namespace main_savitch_3
{
    class sequence
    {
    public:
        // TYPEDEFS and MEMBER CONSTANTS
        typedef double value_type;
        typedef std::size_t size_type;
        static const size_type CAPACITY = 30;
        // CONSTRUCTOR
        sequence( );
        // MODIFICATION MEMBER FUNCTIONS
        void start( );
        void advance( );
        void insert(const value_type& entry);
        void attach(const value_type& entry);
        void remove_current( );
        // CONSTANT MEMBER FUNCTIONS
        size_type size( ) const;
        bool is_item( ) const;
        value_type current( ) const;
    private:
        value_type data[CAPACITY];
        size_type used;
        size_type current_index;
    };
}

#endif

Source

#include "sequence1.h"
#include <assert.h>

namespace main_savitch_3
{

    // Default constructer - sequence is empty
    sequence::sequence()
    {
        used = current_index = 0;
    }


    // Start the iteration
    void sequence::start()
    {
        current_index = 0;
    }
    // Iterate
    void sequence::advance()
    {
        current_index++;
    }


    // Number of items in the sequence
    sequence::size_type sequence::size() const
    {
        return used;
    }
    // Checks if there is a current item
    bool sequence::is_item() const
    {
        return current_index <= used && used > 0;
    }
    // Returns the current value
    sequence::value_type sequence::current() const
    {
        assert(is_item()); // no current item
        return data[current_index];
    }


    // Adds an item BEFORE the current index
    void sequence::insert(const value_type& entry)
    {
        assert(entry != 0); // pointer is invalid
        assert(current_index < sequence::CAPACITY); // no room to add an item

        // move items up - starting with the last item and working down to the current item
        // arrays start at 0, so the -1 adjusts it
        for (size_type i = used - 1; i >= current_index; i--)
            data[i + 1] = data[i];

        data[current_index] = entry;
    }
    // Adds an item AFTER the current index
    void sequence::attach(const value_type& entry)
    {
        assert(entry != 0); // pointer is invalid
        assert(current_index < sequence::CAPACITY); // no room to add an item

        // move items up - starting with the last item and working down to the current item
        // arrays start at 0, so the -1 adjusts it
        for (size_type i = used - 1; i > current_index; i--)
            data[i + 1] = data[i];

        if (current_index = 0)
            data[used] = entry;
        else
            data[current_index + 1] = entry;
    }
    // Removes the current item
    void sequence::remove_current()
    {
        for (size_type i = current_index; i < used; i++)
            data[i] = data[i + 1];
    }

}
57
Caleb Jares

Même si votre projet utilise une méthode main(), l'éditeur de liens devient parfois confus. Vous pouvez résoudre ce problème dans Visual Studio 2010 en allant sur

Projet -> Propriétés -> Propriétés de configuration -> Éditeur de liens -> Système

et en changeant SubSystem en Console.

72
Caleb Jares

Nous avons également eu ce problème. Mon collègue a trouvé une solution. Il s’est avéré être une redéfinition de "main" dans l’en-tête d’une bibliothèque tierce:

#define main    SDL_main

La solution a donc été d'ajouter:

#undef main

avant notre fonction principale.

C'est clairement une stupidité!

36
Anton Andreev

si tu as _tmain _ dans vos projets, vous devez include <tchar.h>.

22
engf-010

Vous avez besoin d'une fonction main() pour que le programme sache par où commencer.

16
James McNellis

Au cas où quelqu'un aurait manqué l'évidence; notez que si vous construisez une application graphique et utilisez
"-sous-système: windows"dans les link-args, l'entrée de l'application est WinMain @ 16. Pas principal (). Par conséquent, vous pouvez utiliser cet extrait pour appeler votre main ():

#include <stdlib.h>
#include <windows.h>

#ifdef __GNUC__
#define _stdcall  __attribute__((stdcall))
#endif

int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
         struct HINSTANCE__ *hPrevInstance,
         char               *lpszCmdLine,
         int                 nCmdShow)
{
  return main (__argc, __argv);
}
9
G. Vanem

Avez-vous implémenté la fonction main()?

int main(int argc, char **argv) {
    ... code ...
    return 0;
}

[edit]

Vous avez votre main() dans un autre fichier source, vous avez donc probablement oublié de l'ajouter à votre projet.

Pour ajouter un fichier source existant: Dans Explorateur de solutions, cliquez avec le bouton droit sur le dossier Fichiers sources, pointez sur Ajouter, puis cliquez sur Article existant. Maintenant, sélectionnez le fichier source contenant le main()

6
ssmir

Si vous utilisez Visual Studio. La raison pour laquelle vous pourriez recevoir cette erreur est peut-être due au fait que vous avez initialement créé un nouvel en-tête file.h, puis que vous l'avez renommé file.cpp, à l'endroit où vous avez placé votre fonction main ().

Pour résoudre le problème, cliquez avec le bouton droit de la souris sur fichier.cpp -> cliquez sur Propriétés, allez à
Propriétés de configuration -> Général -> Item Tapez et remplacez sa valeur par le compilateur C/C++ au lieu de l’en-tête C/C++.

6
user5632040

J'ai eu ce problème malgré:

  • ayant une main(); et
  • configurer tous les autres projets de ma solution pour qu'ils soient des bibliothèques statiques.

Mon correctif éventuel était le suivant:

  • ma main() se trouvait dans un espace de noms, elle était donc effectivement appelée something::main() ... la suppression de cet espace de noms a résolu le problème.
3
Daniel Timms

J'ai rencontré l'erreur LNK2019 alors que je travaillais sur un projet DLL dans Visual Studio 2013.

J'ai ajouté une nouvelle configuration au projet. Mais au lieu d'avoir le "Type de configuration" comme "Bibliothèque dynamique", Visual Studio l'a ajouté comme "Application". Cela a entraîné l'erreur LNK2019.

Correction de l'erreur LNK2019 en allant dans Projet -> Propriétés -> Propriétés de configuration -> Général et remplaçant "Type de configuration" par "Bibliothèque dynamique (.dll)" et "Extension cible" par ".dll".

Oui, la question initiale parle d'un projet console/application, ce qui est un problème différent de ma réponse. Mais je pense que l'ajout de cette réponse pourrait aider quelqu'un (comme moi) qui trébuche sur ce fil.

3
Antony

Vous semblez n'avoir aucune fonction principale, qui est supposée être le point d'entrée de votre programme.

0
Andrew Shelansky