it-swarm.com.de

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

Während ich den folgenden einfachen Code ausführe, treten folgende 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 [email protected] referenziert in Funktion ___tmainCRTStartup

Was soll ich machen?

134
NAIEM

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

341
Bohdan

Wie die anderen erwähnten, können Sie das Subsystem in Console ändern und der Fehler wird behoben.

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

/ ENTRY: "mainCRTStartup"

Auf diese Weise werden Sie das Konsolenfenster los.

80

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

11
David Casper

Fügen Sie <tchar.h> Ein, das die folgende Zeile enthält:

#define _tWinMain wWinMain
9
zaki

Neben der Änderung in Console (/SUBSYSTEM:CONSOLE), wie bereits erwähnt, müssen Sie möglicherweise den Einstiegspunkt in Eigenschaften -> Linker -> Erweitert -> Einstiegspunkt ändern. Setzen Sie es auf mainCRTStartup.

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

9
mathiasfk

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

6
Petronius

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. :)

4
jefry da gucci

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

Das Ändern der 64-Bit-Lib-Dateien auf 32-Bit (x86) hat mir geholfen, ich hoffe, es hilft jemandem da draußen!

3
Another Joe

Wenn es sich bei Ihrem Projekt um eine DLL handelt, möchte der Linker möglicherweise ein Konsolenprogramm erstellen. Öffnen Sie die Projekteigenschaften. Wählen Sie die allgemeinen Einstellungen. Wählen Sie dort den Konfigurationstyp Dynamic Library (.dll).

3
dream_world

Wenn Sie tatsächlich _ tWinMain () anstelle von main () verwenden möchten, vergewissern Sie sich, dass Sie die projektrelevante Konfiguration haben

  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>

3
Alex

Sie haben versucht, diese Quelldatei in eine ausführbare Datei umzuwandeln, was offensichtlich nicht möglich ist, da der obligatorische Einstiegspunkt, die Funktion main, nicht definiert ist. Fügen Sie eine Datei main.cpp hinzu und definieren Sie eine Hauptfunktion. Wenn Sie auf der Kommandozeile arbeiten (was ich bezweifle), können Sie /c nur kompilieren und nicht verlinken. Dadurch wird nur eine Objektdatei erstellt, die entweder mit einer statischen oder einer gemeinsam genutzten Bibliothek oder einer Anwendung verknüpft werden muss (in diesem Fall benötigen Sie eine Oject-Datei mit main defined).

_WinMain ist der Name von Microsoft für main beim Verknüpfen.

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

2
rubenvb

Wenn Sie CMake verwenden, können Sie diesen Fehler auch erhalten, wenn Sie SET(GUI_TYPE WIN32) in einer Konsolenanwendung festlegen.

1

Die oben erwähnten gelehrten Vorschläge werden das Problem in 99,99% der Fälle lösen. Es war mein Glück, dass sie es nicht taten. In meinem Fall stellte sich heraus, dass ich eine Headerdatei aus einem anderen Windows-Projekt einfügte. Ganz am Ende dieser Datei fand ich die Direktive:

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

Unnötig zu erwähnen, dass das Entfernen dieser Zeile mein Problem löste.

0
Moshe Rubin