web-dev-qa-db-fra.com

erreur LNK2019: symbole externe non résolu _WinMain @ 16 référencé dans la fonction ___tmainCRTStartup

Pendant que j'utilise le code simple ci-dessous, j'ai deux erreurs:

#include <iostream>
#include <string>
using namespace::std;

template <class Type>
class Stack
{
public:
    Stack (int max):stack(new Type[max]), top(-1), maxsize(max){}
    ~Stack (void) {delete []stack;}
    void Push (Type &val);
    void Pop (void) {if (top>=0) --top;}
    Type& Top (void) {return stack[top];}
    //friend ostream& operator<< (ostream&, Stack&);
private:
    Type *stack;
    int top;
    const int maxSize;
};

template <class Type>
void Stack <Type>:: Push (Type &val)
{
    if (top+1<maxsize)
        stack [++top]=val;
}

Les erreurs:

MSVCRTD.lib (crtexew.obj): erreur LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction ___tmainCRTStartup

Que devrais-je faire?

134
NAIEM

C'est un problème de l'éditeur de liens.

Essayez de modifier les propriétés -> lieur -> système -> sous-système (dans Visual Studio).

depuis Windows (/ SUBSYSTEM: WINDOWS) vers Console (/ SOBSYSTEM: CONSOLE)

Celui-ci m'a aidé

341
Bohdan

Comme d'autres l'ont mentionné, vous pouvez modifier le sous-système en console et l'erreur disparaîtra.

Ou, si vous souhaitez conserver le sous-système Windows, vous pouvez simplement indiquer votre point d'entrée, car vous n'avez pas défini ___tmainCRTStartup. Vous pouvez le faire en ajoutant ce qui suit à Propriétés -> Éditeur de liens -> Ligne de commande:

/ ENTRY: "mainCRTStartup"

De cette façon, vous vous débarrassez de la fenêtre de la console.

80
Morten Kristensen

Si vous rencontrez ce problème et utilisez Qt, vous devez lier qtmain.lib ou qtmaind.lib.

11
David Casper

Incluez <tchar.h> qui a la ligne:

#define _tWinMain wWinMain
9
zaki

En plus de le changer en Console (/SUBSYSTEM:CONSOLE) comme d'autres l'ont dit, vous devrez peut-être modifier le point d'entrée dans Propriétés -> Éditeur de liens -> Avancé -> Point d'entrée. Réglez-le sur mainCRTStartup.

Il semble que Visual Studio recherche peut-être la fonction WinMain au lieu de main, si vous ne spécifiez pas le contraire.

9
mathiasfk

Si vous utilisez le jeu de caractères Unicode, mais que l'entrée n'a pas été définie, vous pouvez spécifier/ENTRY: "wWinMainCRTStartup"

6
Petronius

je ne vois pas la fonction principale.

s'il vous plaît assurez-vous qu'il a la fonction principale.

exemple :

int main(int argc, TCHAR *argv[]){

}

espérons que cela fonctionne bien. :)

4
jefry da gucci

Je ne sais pas trop où publier cette réponse, mais je pense que c'est le bon endroit. Je suis tombé sur cette erreur aujourd'hui et le changement de sous-systèmes n'a rien changé.

Changer les fichiers de lib 64 bits en 32 bits (x86) a été efficace, j'espère que cela aidera quelqu'un!

3
Another Joe

Si votre projet est Dll, alors le cas peut être que l'éditeur de liens veut créer un programme de console. Ouvrez les propriétés du projet. Sélectionnez les paramètres généraux. Sélectionnez le type de configuration Dynamic Library là-bas (.dll).

3
dream_world

Si vous voulez réellement utiliser _ tWinMain () au lieu de main (), assurez-vous que la configuration pertinente de votre projet est

  1. Éditeur de liens-> Système -> Sous-système => Windows (/ SOUS-SYSTEME: WINDOWS)
  2. C/C++ -> Préprocesseur -> Définitions du préprocesseur => Remplacer _CONSOLE par _WINDOWS
  3. Dans le fichier c/cpp où _ tWinMain () est défini, ajoutez:

    #include <Windows.h>#include <tchar.h>

3
Alex

Vous avez essayé de transformer ce fichier source en un exécutable, ce qui n’est évidemment pas possible, car le point d’entrée obligatoire, la fonction main, n’est pas défini. Ajoutez un fichier main.cpp et définissez une fonction principale. Si vous travaillez sur la ligne de commande (ce dont je doute), vous pouvez ajouter /c uniquement pour compiler et non pour lier. Cela produira un fichier objet uniquement, qui doit être lié à une bibliothèque statique ou partagée ou à une application (dans ce cas, vous aurez besoin d'un fichier objet avec le fichier principal défini).

_WinMain est le nom de Microsoft pour main lors de la liaison.

Aussi: vous n’exécutez pas encore le code, vous l’utilisez compilez (et le liez). C++ n'est pas un langage interprété.

2
rubenvb

Si vous utilisez CMake, vous pouvez également obtenir cette erreur lorsque vous définissez SET(GUI_TYPE WIN32) sur une application console.

1
Nicolas Holthaus

Les suggestions savantes mentionnées ci-dessus résoudront le problème dans 99,99% des cas. C'était ma chance qu'ils ne l'ont pas fait. Dans mon cas, il est apparu que j'incluais un fichier d'en-tête provenant d'un autre projet Windows. Effectivement, tout au bas de ce fichier, j'ai trouvé la directive:

#pragma comment(linker, "/subsystem:Windows")

Inutile de dire que supprimer cette ligne a résolu mon problème.

0
Moshe Rubin