Fehler LNK2019: ungelöstes externes Symbol _WinMain @ 16, auf das in der Funktion ___tmainCRTStartup verwiesen wird

143

Während ich den folgenden einfachen Code ausführe, treten zwei Fehler auf:

#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;
}

Fehler:

MSVCRTD.lib (crtexew.obj): Fehler LNK2019: Nicht aufgelöstes externes Symbol, _WinMain@16auf das in der Funktion verwiesen wird___tmainCRTStartup

Was soll ich machen?

NAIEM
quelle
1
Ist das der ganze Code? Wo ist deine Hauptfunktion?
Connman
2
Sieht auch so aus, als ob der Projekttyp falsch eingestellt ist. Der Linker-Fehler in Bezug auf WinMain impliziert, dass Sie versucht haben, ein Win32-Projekt zu erstellen. Wenn Sie nur Text an der Eingabeaufforderung ausgeben möchten, ändern Sie den Projekttyp in Konsole.
Kilanash
4
Übrigens, wenn Sie Compiler- / Linker-Fehler bekommen, "führen" Sie den Code nicht aus.
André Caron
1
Ich habe versucht, den Projekttyp zu ändern, aber project = exe funktionierte anstelle der Konsole.
Dom

Antworten:

352

Das ist ein Linker-Problem.

Versuchen Sie, Eigenschaften -> Linker -> System -> Subsystem (in Visual Studio) zu ändern.

von Windows (/ SUBSYSTEM: WINDOWS) zur Konsole (/ SUBSYSTEM: CONSOLE)

Dieser hat mir geholfen

Bohdan
quelle
3
Ich habe das gleiche Problem. Ihre Antwort hilft nicht. Irgendwelche anderen Vorschläge?
Parth Sane
1
Ich hatte dieses Problem bei der Verwendung von MS Visual Studio. Wenn Ihre Umgebung anders ist, müssen Sie sie möglicherweise anders beheben. Aber es sollte immer noch ein Linkerproblem sein.
Bohdan
2
Wenn Sie tWinMainals Hauptfunktion verwenden, müssen Sie tchar.h einschließen oder in entweder WinMainoder wWinMainabhängig davon ändern, ob Ihre App Unicode ist oder nicht. Wenn Sie dies nicht tun, wird dieser Linkerfehler auch mit dem richtigen Subsystem angezeigt. (/ SUBSYSTEM: WINDOWS)
Lisa
Dies hat mir geholfen, außerdem musste ich Avast Antivirus deaktivieren .
XCS
1
Dies funktionierte erst, nachdem ich "Alle Konfigurationen" für Plattform und Typ ausgewählt hatte. Durch Auswahl von "Build" in der "Lösung" wurde versucht, alle zu erstellen, und der erste Versuch war NICHT der für das Konsolensubsystem angegebene.
Joseph Stateson
83

Wie bereits erwähnt, können Sie das Subsystem in "Konsole" ändern, und der Fehler wird behoben.

Wenn Sie das Windows-Subsystem beibehalten möchten, können Sie nur einen Hinweis auf Ihren Einstiegspunkt geben, da Sie diesen nicht definiert haben ___tmainCRTStartup. Sie können dies tun, indem Sie Eigenschaften -> Linker -> Befehlszeile Folgendes hinzufügen :

/ ENTRY: "mainCRTStartup"

Auf diese Weise wird das Konsolenfenster entfernt.

Morten Kristensen
quelle
3
+1: "Auf diese Weise wird das Konsolenfenster entfernt." - Cool! Etwas gelernt. heute neu!
Valentin Heinitz
1
+1 für den Rat, ich habe versucht, dies für etwa 20 Minuten herauszufinden, da ich mit SFML nur das Subsystem Windows angeben kann, mit GLFW, das offensichtlich nicht so anders ist, danke (=
Daniel
14

Wenn Sie dieses Problem haben und Qt verwenden, müssen Sie qtmain.lib oder qtmaind.lib verknüpfen

David Casper
quelle
Das ist auf Projekt -> Eigenschaften -> Linker -> Eingabe. In $(QTDIR)\lib\qtmaind.libauf zusätzliche Abhängigkeiten.
Mathiasfk
1
Durch Hinzufügen CONFIG += consolezur .proDatei wurde das Problem für mein Qt-Projekt
behoben
12

Neben der Änderung in, Console (/SUBSYSTEM:CONSOLE)wie andere bereits gesagt haben, müssen Sie möglicherweise den Einstiegspunkt unter Eigenschaften -> Linker -> Erweitert -> Einstiegspunkt ändern . Stellen Sie es auf mainCRTStartup ein .

Es scheint, dass Visual Studio möglicherweise nach der WinMain-Funktion anstelle von main sucht, wenn Sie nichts anderes angeben.

mathiasfk
quelle
10

Fügen Sie hinzu, <tchar.h>welche die Zeile hat:

#define _tWinMain wWinMain
Zaki
quelle
7

Wenn Sie den Unicode-Zeichensatz verwenden, der Eintrag jedoch nicht festgelegt wurde, können Sie / ENTRY angeben: "wWinMainCRTStartup"

Petronius
quelle
Lebensretter für mich! Ich benutzte cmake + mfc (Unicode)
Malat
4

Ich sehe die Hauptfunktion nicht.

Bitte stellen Sie sicher, dass es Hauptfunktion hat.

Beispiel:

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

}

hoffe, dass es gut funktioniert. :) :)

jefry da gucci
quelle
Das hilft nicht. Der Linker beschwert sich über einen undefinierten WinMain- Einstiegspunkt. Das Definieren eines aufgerufenen Einstiegspunkts mainlöst dies nicht.
Unsichtbarer
Der Linker versucht, verschiedene main/ WinMainVersionen aufzulösen. Wenn keine gefunden wird, wird WinMain @ 16 nicht gefunden , aber diese Meldung ist nicht genau korrekt.
Lorinczy Zsigmond
3

Wenn Ihr Projekt Dll ist, kann es sein, dass der Linker ein Konsolenprogramm erstellen möchte. Öffnen Sie die Projekteigenschaften. Wählen Sie die allgemeinen Einstellungen. Wählen Sie dort den Konfigurationstyp Dynamic Library (.dll).

Traumwelt
quelle
Ich habe genau dieses Problem, aber obwohl der .dllCompiler eingestellt ist, versucht er immer noch, eine Windows-App zu erstellen.
Tomáš Zato - Wiedereinsetzung Monica
3

Ich bin mir nicht sicher, wo ich meine Antwort posten soll, aber ich denke, es ist der richtige Ort. Ich bin heute auf genau diesen Fehler gestoßen, und das Wechseln der Subsysteme hat nichts geändert.

Das Ändern der 64-Bit-Lib-Dateien auf 32-Bit (x86) hat den Trick für mich getan. Ich hoffe, es wird jemandem da draußen helfen!

Ein weiterer Joe
quelle
Ich habe dies versucht und gearbeitet, obwohl eine Neukompilierung von Abhängigkeiten zu denselben Zielen auch funktioniert.
Jamie Nicholl-Shelley
hat auch für mich funktioniert ... scheint, dass der Unit-Test-Assistent einen 32-Bit-Einstiegspunkt verwendet
Erik Aronesty
3

Wenn Sie tatsächlich _tWinMain () anstelle von main () verwenden möchten, stellen Sie sicher, dass Ihre projektrelevante Konfiguration vorhanden ist

  1. Linker-> System -> SubSystem => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Präprozessor -> Präprozessordefinitionen => Ersetzen Sie _CONSOLE durch _WINDOWS
  3. Fügen Sie in der c / cpp-Datei, in der _tWinMain () definiert ist, Folgendes hinzu:

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

Alex
quelle
2

Sie haben versucht, diese Quelldatei in eine ausführbare Datei umzuwandeln, was offensichtlich nicht möglich ist, da der obligatorische Einstiegspunkt, die mainFunktion, nicht definiert ist. Fügen Sie eine Datei main.cpp hinzu und definieren Sie eine Hauptfunktion. Wenn Sie an der Befehlszeile arbeiten (was ich bezweifle), können Sie /cnur zum Kompilieren und nicht zum Verknüpfen hinzufügen . Dadurch wird nur eine Objektdatei erstellt, die entweder mit einer statischen oder gemeinsam genutzten Bibliothek oder einer Anwendung verknüpft werden muss (in diesem Fall benötigen Sie eine Objektdatei mit definierter Hauptdatei).

_WinMainist der Name von Microsoft für die mainVerknüpfung.

Außerdem: Sie führen den Code noch nicht aus, Sie kompilieren (und verknüpfen ihn). C ++ ist keine interpretierte Sprache.

rubenvb
quelle
5
Eigentlich braucht er einen WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)Einstiegspunkt. Dieser Linkerfehler zeigt an, dass das Projekt für das Windows-Subsystem und nicht für das Konsolensubsystem erstellt wird.
Adam Maras
@Adam: ah ja, ich bin von Qt verwöhnt worden :) (was WinMain effektiv vor dir verbirgt).
Rubenvb
WinMain ist nur für Windows-Anwendungen. Konsolen-Apps verwenden einen anderen Namen _tmain, der je nach Unicode / MBCS-Einstellung in main oder wmain aufgelöst wird.
Steve Townsend
@ AdamMaras, perfekt. Ich suchte nach der erforderlichen Groß- und Kleinschreibung und dem erforderlichen Prototyp. Es funktioniert jetzt perfekt. Vielen Dank!
Synetech
_WinMain@16ist das dekorierte Symbol des vom Benutzer bereitgestellten Einstiegspunkts, der vom Startcode in der CRT aufgerufen wird, wenn auf das Windows-Subsystem abgezielt wird. Es ist nicht "Microsoft Name für mainbeim Verknüpfen" . Wenn Sie auf das Konsolensubsystem abzielen, ruft die mit Visual Studio gelieferte CRT einen Einstiegspunkt mit dem Namen auf main. Wenn nicht definiert, beschwert sich der Linker über ein fehlendes Symbol namens _main.
Unsichtbarer
1

Wenn Sie CMake verwenden, kann dieser Fehler auch angezeigt werden, wenn Sie SET(GUI_TYPE WIN32)eine Konsolenanwendung festlegen .

Nicolas Holthaus
quelle
1

Die oben genannten gelehrten Vorschläge lösen das Problem in 99,99% der Fälle. Es war mein Glück, dass sie es nicht taten. In meinem Fall stellte sich heraus, dass ich eine Header-Datei aus einem anderen Windows-Projekt einfügte. Sicher genug, ganz unten in dieser Datei habe ich die Direktive gefunden:

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

Das Entfernen dieser Zeile hat natürlich mein Problem gelöst.

Moshe Rubin
quelle