2016-07-22 11 views
0

Ich bekomme MinGWs g ++ nicht, um SDL-Programme erfolgreich zu kompilieren. Hier ist mein Beispielprogramm:Verbindung mit MinGW und SDL nicht möglich: undefinierter Verweis auf WinMain @ 16

#include <SDL.h> 

int main(int argc, char* args[]) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Quit(); 
    return 0; 
} 

und hier ist mein Befehl und Fehlerbericht:

C:\Users\briggs_w\Desktop\testSDL>g++ test.cc -IC:\MinGW\include\SDL 
-LC:\MinGW\lib -lSDL2 -lSDL2main -lmingw32 

C:\MinGW\lib/libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 

ich kopiert alles in SDL2 der lib\x64 und i686-w64-mingw32\lib Ordner auf den C:\MinGW\lib Ordner.

Was fehlt? An der Kommandozeile, vielleicht.

ich über zwei Threads auf ähnliche Fehler aussahen:

Undefined reference to [email protected] when using SDL - tun diese

undefined reference to [email protected] C++, SDL-2 - keine Wirkung

+0

'-lmingw32 -lSDL2main -lSDL2', genau in dieser Reihenfolge (und natürlich alle src/obj vor den Bibliotheken). – keltar

+0

Das hat super funktioniert. Ich würde es als Antwort akzeptieren. –

Antwort

0

ich Ihren Code kompiliert, so dass Compiler und Linker-Flags von sdl2-config bereitgestellt wurden (in einem Paket enthalten msys2):

gcc -O -Wall test.cpp `sdl2-config --cflags --libs` 

$ SDL2-config --cflags

-I/mingw64/include/SDL2 -Dmain = SDL_main

$ SDL2-config --libs

-L/mingw64/lib -lmingw32 -lSDL2main - lSDL2 -mwindows

So zumindest -lmingw32 in Bibliotheken in anderer Position verknüpft werden und auch -Dmain=SDL_main fehlte. Die Bibliothek SDL2main ist eine statische Bibliothek, daher muss mingw32 beim Verknüpfen davor stehen.

Von SDL FAQ for windows

sollten Sie Haupt werden() anstelle von WinMain(), obwohl Sie sind eine Windows-Anwendung erstellen, weil SDL eine Version von WinMain bietet(), die eine SDL Initialisierung führt vor Rufen Sie Ihren Hauptcode an. Wenn Sie aus irgendeinem Grund WinMain() verwenden müssen, schauen Sie sich im SDL-Quellcode in src/main/win32/SDL_main.c an, um zu sehen, welche Art der Initialisierung Sie in Ihrer WinMain() - Funktion ausführen müssen SDL funktioniert ordnungsgemäß.

Wenn es so etwas wie SDL2-config verfügbar bei jeder Bibliothek ist, würde ich zumindest überprüfen, was es gibt.

+0

Wenn dies der Fall wäre, hätte es einen "undefinierten Verweis auf SDL_main" gegeben, ist es aber nicht. – keltar

+0

@keltar meine Vermutung ist, dass 'mwindows' 'main' zu' WinMain' übersetzt, und dann 'WinMain' in der SDL2main-Bibliothek wird als Duplikat verworfen und wird nicht referenziert, und daher wird SDL_main nicht referenziert. –

+0

Nein, libmingw32.a verweist auf WinMain und kann keinen finden.ld-Linker ist empfindlich für die Reihenfolge der Bibliotheken, insbesondere wenn Bibliotheken statisch sind. Ihre Bestellung ist korrekt, also verlinkt; Auftrag in Frage ist nicht. – keltar