2013-09-07 16 views
14

ich diesen Code kompilieren wollen:SDL2: LNK1561: Einstiegspunkt muss definiert werden

#include <SDL.h> 

int main(int argc, char* argv[]) { 
    return 0; 
} 

Aber es kann nicht verknüpft werden: Error 1 error LNK1561: entry point must be defined

Es gibt einige seltsame Code in dieser Bibliothek: http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main SDL_main 

Auch ich habe SDL2.lib;SDL2main.lib zu Projekteinstellungen hinzugefügt => Linker => Input.

Was kann ich tun, um dieses Projekt auszuführen?
VS 2012 SP3, leeres C++ - Projekt.

+2

möglich Duplikat [Warum SDL Haupt Makro definiert?] (Http: // stackoverflow.com/questions/11976084/why-sdl-defines-main-macro) –

+0

Konsolenanwendung? – 4pie0

+2

@MikeSeymour, es ist kein Duplikat: Dieser Thread enthält keine Antwort. – DmitryR

Antwort

34

das ist, was ich gefunden habe here:

Rechtsklick auf Projektname -> Eigenschaften -> erweitern Linkers tab -> System -> SubSystem: Stellen Sie sicher, dass es Console (/ SUBSYSTEM: CONSOLE) ist

+0

Hinzufügen, wenn Sie int main() selbst kompilieren können, dann stellen Sie sicher, dass Sie Ihre Compiler-Einstellungen wie hier erwähnt überprüft haben, je nachdem, wie Sie Ihr Projekt erstellt haben, kann diese Einstellung nicht für Sie getan werden bereits. Wie war mein Problem. – ReturnVoid

1

Als tinky_winki schrieb

Rechts auf Projektnamen klicken -> Eigenschaften -> erweitern Linkers tab -> System -> SubSystem: stellen sie sicher, dass es Console (/ SUBSYSTEM: CONSOLE)

Aber wenn Sie nicht erwarten, Konsole mit Fenstern einfach verwenden, /SUBSYSTEM: WINDOWS

2

ich gefunden habe, dass /SUBSYSTEM Einstellung: console nur die Hälfte der Lösung. Die zweite Hälfte ist hinzuzufügen SDL_MAIN_HANDLED zu Ihren zusätzlichen definiert. Der Hinweis, den ich verwendet habe, um dies zu lösen, kann in SDL_main.h gefunden werden. Setzen Sie SDL_MAIN_HANDLED die SDL-Header-Dateien, die Sie bereits eine main-Funktion zur Verfügung gestellt haben und nicht wünschen, dass es seinen eigenen Einstiegspunkt neu definiert.

+0

Dies ist der richtige Weg, um dieses Problem zu lösen - gute Debugging-Fähigkeiten @dpiron. Wenn Ihr Projekt zu Beginn korrekt eingerichtet ist, sollten Sie die Linker-Eigenschaften zu diesem Zeitpunkt nicht ändern müssen – user3001499

1

NICHT#undef main! Während es auf der SDL-Seite eine wirklich schlechte Übung ist, es neu zu definieren, haben sie gute Gründe: WinMain ist auf der Bibliotheksseite definiert und wird verwendet, um einige Init-Codes auszuführen, was bei Kompatibilitätsproblemen hilft. (noch mehr bei der Verwendung verschiedener SDL-Implementierungen, wie Steam oder Portieren auf andere Plattformen wie Android)

Also was sollten Sie tun? Wenn auf Windows, sollen Sie immer SDL2main.lib vor SDL2.lib enthalten und stellen Sie sicher, dass Ihr Haupt im Format ist:

int main(int argc, char* argv[]) // CORRECT 
void main(int argc, char* argv[]) // WRONG 
int main(int, char**) // MAY BE CORRECT 

Quelle: SDL2 Windows FAQ

+0

Die 'int main (int, char **)' ist auch korrekt. Außerdem, was ist mit Steam SDL Implementierung? Google scheint davon nichts zu wissen. – HolyBlackCat

+1

@HolyBlackCat https://wiki.libsdl.org/Installation#SteamOS SDL bietet einen dynamischen Lader und Steam ist dafür bekannt, dass es eine eigene Kopie von SDL enthält, die für SteamOS anders ist –