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

143

Pendant que j'exécute le code simple comme ci-dessous, j'ai deux erreurs comme suit:

#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@16référencé dans la fonction___tmainCRTStartup

Que devrais-je faire?

NAIEM
la source
1
Est-ce tout le code? Où est votre fonction principale?
Connman
2
On dirait également que le type de projet est mal défini. L'erreur de l'éditeur de liens concernant WinMain implique que vous avez essayé de créer un projet Win32. Si vous voulez simplement que quelque chose envoie du texte à l'invite de commande, essayez de changer le type de projet en Console.
Kilanash
4
En passant, si vous obtenez des erreurs de compilateur / éditeur de liens, vous ne "exécutez" pas le code.
André Caron
1
J'ai essayé de changer le type de projet, mais project = exe fonctionnait à la place de la console.
Dom

Réponses:

352

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

Essayez de modifier Propriétés -> Éditeur de liens -> Système -> Sous-système (dans Visual Studio).

de Windows (/ SUBSYSTEM: WINDOWS) à la console (/ SUBSYSTEM: CONSOLE)

Celui-ci m'a aidé

Bohdan
la source
3
J'ai le même problème. Votre réponse n'aide pas. Une autre suggestion?
Parth Sane
1
J'ai eu ce problème lors de l'utilisation de MS Visual Studio. Si votre environnement est différent, vous devrez peut-être le réparer différemment. Mais cela devrait toujours être un problème de lien.
Bohdan
2
Si vous utilisez tWinMaincomme fonction principale, vous devez inclure tchar.h ou le remplacer par WinMainou wWinMainselon que votre application est ou non Unicode. Ne pas le faire entraîne également cette erreur de l'éditeur de liens même avec le sous-système approprié. (/ SUBSYSTEM: WINDOWS)
lisa
Cela m'a aidé, à part cela, j'ai également dû désactiver l'antivirus Avast .
XCS
1
Cela n'a fonctionné qu'après avoir sélectionné "toutes les configurations" pour la plate-forme et le type. La sélection de "build" sur la "Solution" a tenté de tout construire et le premier essayé n'était PAS celui spécifié pour le sous-système de console.
Joseph States
83

Comme les autres l'ont mentionné, vous pouvez changer 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 quel est 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.

Morten Kristensen
la source
3
+1: "De cette façon, vous vous débarrassez de la fenêtre de la console." - Cool! Appris qc. nouveau aujourd'hui!
Valentin Heinitz
1
+1 pour le conseil, j'essayais de comprendre cela pendant 20 minutes, car avec SFML, je peux simplement spécifier le sous-système Windows, avec GLFW qui ne diffèrent évidemment pas si merci (=
daniel
14

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

David Casper
la source
C'est sur Projet -> Propriétés -> Linker -> Entrée. Ajouter $(QTDIR)\lib\qtmaind.libaux dépendances supplémentaires.
mathiasfk
1
L'ajout CONFIG += consoleau .profichier a résolu le problème de mon projet Qt
Synck le
12

En plus de le changer en Console (/SUBSYSTEM:CONSOLE)comme d'autres l'ont dit, vous devrez peut-être changer 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.

mathiasfk
la source
10

Inclure <tchar.h>ce qui a la ligne:

#define _tWinMain wWinMain
zaki
la source
7

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"

Pétrone
la source
sauveur de vie pour moi! J'utilisais cmake + mfc (unicode)
malat
4

je ne vois pas la fonction principale.

veuillez vous assurer qu'il a la fonction principale.

exemple :

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

}

espérons que cela fonctionne bien. :)

jefry da gucci
la source
Cela n'aide pas. L'éditeur de liens se plaint d'un point d'entrée WinMain non défini . La définition d'un point d'entrée appelé mainne résout rien à cela.
IInspectable le
L'éditeur de liens essaie de résoudre différentes main/ WinMainversions, et si aucune d'elles n'est trouvée, il indique que WinMain @ 16 est introuvable , mais ce message n'est pas exactement correct.
Lorinczy Zsigmond
3

Si votre projet est Dll, le cas peut être que l'éditeur de liens souhaite 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 (.dll).

monde imaginaire
la source
J'ai exactement ce problème, mais bien que le .dllcompilateur est toujours en train d'essayer de créer une application Windows.
Tomáš Zato - Réintégrer Monica
3

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

Changer les fichiers lib 64 bits en 32 bits (x86) a fait l'affaire pour moi, j'espère que cela aidera quelqu'un là-bas!

Un autre Joe
la source
J'ai essayé et travaillé, bien qu'une recompilation des dépendances vers les mêmes cibles fonctionne également.
Jamie Nicholl-Shelley
a également fonctionné pour moi ... il semble que l'assistant de test unitaire utilise un point d'entrée 32 bits
Erik Aronesty
3

Si vous souhaitez réellement utiliser _tWinMain () au lieu de main (), assurez-vous que la configuration pertinente de votre projet a

  1. Linker-> Système -> Sous-système => Windows (/ SUBSYSTEM: 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>

Alex
la source
2

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 mainfonction, 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 /cuniquement pour compiler et non pour lier. Cela produira uniquement un fichier objet, qui doit être lié à une bibliothèque statique ou partagée ou à une application (auquel cas vous aurez besoin d'un fichier oject avec main défini).

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

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

rubenvb
la source
5
En fait, il a besoin d'un WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)point d'entrée. Cette erreur de l'éditeur de liens indique que le projet est en cours de création pour le sous-système Windows, pas pour le sous-système de la console.
Adam Maras
@Adam: ah oui, j'ai été gâté par Qt :) (qui vous cache efficacement WinMain).
rubenvb
WinMain est uniquement destiné aux applications Windows. Les applications de console utilisent un nom différent _tmain, qui se résout en main ou wmain en fonction du paramètre Unicode / MBCS.
Steve Townsend
@AdamMaras, parfait. Je cherchais la capitalisation et le prototype requis. Cela fonctionne parfaitement maintenant. Merci!
Synetech
_WinMain@16est le symbole décoré du point d'entrée fourni par l'utilisateur appelé par le code de démarrage dans le CRT, lors du ciblage du sous-système Windows. Ce n'est pas "le nom de Microsoft pour la mainliaison" . Si vous ciblez le sous-système de console, le CRT fourni avec Visual Studio appellera un point d'entrée nommémain . S'il n'est pas défini, l'éditeur de liens se plaindra d'un symbole appelé _main.
IInspectable
1

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

Nicolas Holthaus
la source
1

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 s'est avéré que j'incluais un fichier d'en-tête d'un autre projet Windows. Effectivement, tout en bas de ce fichier, j'ai trouvé la directive:

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

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

Moshe Rubin
la source