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@16
auf das in der Funktion verwiesen wird___tmainCRTStartup
Was soll ich machen?
c++
visual-studio
visual-c++
NAIEM
quelle
quelle
Antworten:
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
quelle
tWinMain
als Hauptfunktion verwenden, müssen Sie tchar.h einschließen oder in entwederWinMain
oderwWinMain
abhä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)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 :Auf diese Weise wird das Konsolenfenster entfernt.
quelle
Wenn Sie dieses Problem haben und Qt verwenden, müssen Sie qtmain.lib oder qtmaind.lib verknüpfen
quelle
$(QTDIR)\lib\qtmaind.lib
auf zusätzliche Abhängigkeiten.CONFIG += console
zur.pro
Datei wurde das Problem für mein Qt-ProjektNeben 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.
quelle
Fügen Sie hinzu,
<tchar.h>
welche die Zeile hat:quelle
Wenn Sie den Unicode-Zeichensatz verwenden, der Eintrag jedoch nicht festgelegt wurde, können Sie / ENTRY angeben: "wWinMainCRTStartup"
quelle
Ich sehe die Hauptfunktion nicht.
Bitte stellen Sie sicher, dass es Hauptfunktion hat.
Beispiel:
hoffe, dass es gut funktioniert. :) :)
quelle
main
löst dies nicht.main
/WinMain
Versionen aufzulösen. Wenn keine gefunden wird, wird WinMain @ 16 nicht gefunden , aber diese Meldung ist nicht genau korrekt.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).
quelle
.dll
Compiler eingestellt ist, versucht er immer noch, eine Windows-App zu erstellen.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!
quelle
Wenn Sie tatsächlich _tWinMain () anstelle von main () verwenden möchten, stellen Sie sicher, dass Ihre projektrelevante Konfiguration vorhanden ist
Fügen Sie in der c / cpp-Datei, in der _tWinMain () definiert ist, Folgendes hinzu:
#include <Windows.h>
#include <tchar.h>
quelle
Sie haben versucht, diese Quelldatei in eine ausführbare Datei umzuwandeln, was offensichtlich nicht möglich ist, da der obligatorische Einstiegspunkt, die
main
Funktion, 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/c
nur 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)._WinMain
ist der Name von Microsoft für diemain
Verknüpfung.Außerdem: Sie führen den Code noch nicht aus, Sie kompilieren (und verknüpfen ihn). C ++ ist keine interpretierte Sprache.
quelle
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._WinMain@16
ist 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ürmain
beim Verknüpfen" . Wenn Sie auf das Konsolensubsystem abzielen, ruft die mit Visual Studio gelieferte CRT einen Einstiegspunkt mit dem Namen aufmain
. Wenn nicht definiert, beschwert sich der Linker über ein fehlendes Symbol namens_main
.Wenn Sie CMake verwenden, kann dieser Fehler auch angezeigt werden, wenn Sie
SET(GUI_TYPE WIN32)
eine Konsolenanwendung festlegen .quelle
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:
Das Entfernen dieser Zeile hat natürlich mein Problem gelöst.
quelle