SDL2: LNK1561: Einstiegspunkt muss definiert werden

Lesezeit: 4 Minuten

Benutzer-Avatar
Dmitri

Ich möchte diesen Code kompilieren:

#include <SDL.h>

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

Aber es lässt sich nicht verlinken: Error 1 error LNK1561: entry point must be defined

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

#define main    SDL_main

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

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

  • Mögliches Duplikat von Warum SDL das Hauptmakro definiert?

    – Mike Seymour

    7. September 2013 um 10:25 Uhr

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

    – Dmitri

    7. September 2013 um 10:32 Uhr


  • @Computer, ja, Konsole.

    – Dmitri

    7. September 2013 um 10:35 Uhr

  • Ich habe gerade angefangen, c zu lernen und bin auf denselben Fehler gestoßen, dieser Fehler bedeutet, dass etwas nicht stimmt main()in meinem Code hatte ich es falsch geschrieben als Main mit großem m, nach der Korrektur verschwand der Fehler.

    – rasieren

    28. Juli 2014 um 19:27 Uhr

Benutzer-Avatar
4pie0

Entsprechend dieser Faden auf Dream.In.Code:

Klicken Sie mit der rechten Maustaste auf den Projektnamen -> Eigenschaften -> Registerkarte Linker erweitern -> System -> Subsystem: Stellen Sie sicher, dass dies der Fall ist Console (/SUBSYSTEM:CONSOLE)

Wenn Sie alternativ das Konsolenfenster ausblenden oder eine Multithread-Anwendung debuggen möchten, sollten Sie das SubSystem auf einstellen Window (/SUBSYSTEM:WINDOW) stattdessen.

  • Wenn Sie int main() dazu bringen können, sich selbst zu kompilieren, stellen Sie sicher, dass Sie Ihre Compilereinstellungen wie hier erwähnt überprüft haben, da je nachdem, wie Sie Ihr Projekt erstellt haben, diese Einstellung möglicherweise noch nicht für Sie erledigt ist . Genauso wie mein Problem.

    – RücksendungVoid

    20. November 2016 um 6:00 Uhr

  • Ich füge dieser Antwort hinzu. Wenn Sie eine SDL2-App debuggen und Multithreading zu dieser App hinzugefügt haben, anstatt sie zu verwenden Console (/SUBSYSTEM:CONSOLE)verwenden Window (/SUBSYSTEM:WINDOW). Dadurch sollte Visual Studio 2017 seinen lokalen Debugger auch erfolgreich an Ihre SDL2-App anhängen können, sodass Sie mehrere Threads gleichzeitig debuggen können.

    – tom_mai78101

    12. Mai 2018 um 1:53 Uhr

  • Keine Zeit mehr, meinen letzten Kommentar zu bearbeiten … Grund, warum Sie mitmachen müssen Window (/SUBSYSTEM:WINDOW) Denn Console (/SUBSYSTEM:CONSOLE) ist nur Single-Threaded.

    – tom_mai78101

    12. Mai 2018 um 2:03 Uhr


Ich habe diese Einstellung gefunden /SUBSYSTEM:KONSOLE ist nur die halbe Lösung. Die zweite Hälfte ist hinzuzufügen SDL_MAIN_HANDLED zu Ihren zusätzlichen Definitionen. Der Hinweis, den ich verwendet habe, um dies zu lösen, kann in gefunden werden SDL_main.h. Einstellung SDL_MAIN_HANDLED Teilen Sie den SDL-Header-Dateien mit, dass Sie bereits eine bereitgestellt haben main Funktion und möchten nicht, dass sie ihren eigenen Einstiegspunkt neu definiert.

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

    – Benutzer3001499

    15. September 2017 um 17:20 Uhr


  • Um weitere Informationen zu dem hinzuzufügen, worauf sich @user3001499 bezieht, müssen Sie mit a beginnen win32 Anwendungsprojekt, siehe VisualC.html.

    – jrh

    25. September 2018 um 15:25 Uhr

Benutzer-Avatar
Gustav Maciel

NICHT #undef main! Während es auf SDL-Seite eine wirklich schlechte Praxis ist, es neu zu definieren, haben sie gute Gründe: WinMain ist auf der Bibliotheksseite definiert und wird zum Ausführen von Init-Code verwendet, was bei Kompatibilitätsproblemen hilft. (noch mehr, wenn Sie andere SDL-Implementierungen wie Steam verwenden oder auf andere Plattformen wie Android portieren)

Was sollten Sie also tun? Unter Windows sollten Sie immer einschließen SDL2main.lib Vor SDL2.lib und stellen Sie sicher, dass Ihre Hauptdatei das folgende Format hat:

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

Quelle: Häufig gestellte Fragen zu SDL2 Windows

  • Das int main(int, char**) ist auch richtig. Und was ist mit der Steam-SDL-Implementierung? Google scheint davon nichts zu wissen.

    – HolyBlackCat

    15. Juli 2017 um 21:41 Uhr


  • @HolyBlackCat wiki.libsdl.org/Installation#SteamOS SDL bietet einen dynamischen Loader und Steam enthält bekanntermaßen eine eigene Kopie von SDL, die für SteamOS unterschiedlich ist

    – Gustavo Maciel

    17. Juli 2017 um 0:43 Uhr


  • Beachten Sie, dass es auch notwendig ist, eine zu erstellen win32 Anwendungsprojekt. Sehen VisualC.html.

    – jrh

    25. September 2018 um 15:24 Uhr

Als ein tinky_winki schrieb

Klicken Sie mit der rechten Maustaste auf den Projektnamen -> Eigenschaften -> Registerkarte Linker erweitern -> System -> Subsystem: Stellen Sie sicher, dass es Konsole ist (/SUBSYSTEM:CONSOLE)

Aber wenn Sie keine Konsole mit Fenster erwarten, verwenden Sie einfach, /SUBSYSTEM:WINDOWS

Project >> Properties >> Linker >> Advanced >> entry point = main und apply

Benutzer-Avatar
Tut mir leid, ich sage es nicht

Offen sdl_main.h

Veränderung

#define main sdl_main

zu

#define sdl_main main

jetzt geht es mit simple int Haupt() aber das ist ein schlechtes Hurra für kurzfristige Lösungen

1186930cookie-checkSDL2: LNK1561: Einstiegspunkt muss definiert werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy