2016-07-22 161 views
0

我沒有得到MinGW的g ++來成功編譯SDL程序。這裏是我的示例程序:使用MinGW和SDL無法鏈接:未定義引用WinMain @ 16

#include <SDL.h> 

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

這是我的命令和錯誤報告:

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 

我複製一切SDL2的lib\x64i686-w64-mingw32\lib文件夾複製到文件夾C:\MinGW\lib

什麼是缺失?也許在命令行。

我過目兩個線程上類似的錯誤:

Undefined reference to [email protected] when using SDL - 這樣

undefined reference to [email protected] C++, SDL-2 - 不影響

+0

'-lmingw32 -lSDL2main -lSDL2',正好按照這個順序(當然還有libs之前的所有src/obj)。 – keltar

+0

這很好。我會接受它作爲答案。 –

回答

0

我編譯你的代碼,使編譯器和連接器選項被sdl2-config提供(包括在msys2包):

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

$ SDL2-配置--cflags

-I/mingw64 /包含/ SDL2 -Dmain = SDL_main

$ SDL2-配置--libs

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

所以至少-lmingw32是在圖書館的其他位置進行鏈接也-Dmain=SDL_main失蹤。庫SDL2main是一個靜態庫,所以在鏈接時需要mingw32先於它。

SDL FAQ for windows

您應該使用的main()代替的WinMain(),即使你是 創建一個Windows應用程序,因爲SDL提供了一個版本 的WinMain(的),它之前要進行一些SDL初始化打電話給你 的主要代碼。如果由於某種原因需要使用WinMain(),請在src/main/win32/SDL_main.c的SDL源代碼中查看 ,以瞭解在WinMain()函數中需要做什麼類型的初始化操作,以便 SDL正常工作。

如果有類似SDL2-配置提供任何庫的情況下,我想至少檢查它所輸出。

+0

如果是這種情況,那麼會出現'未定義的SDL_main引用',但事實並非如此。 – keltar

+0

@keltar我的猜測是'-mwindows'將'main'翻譯爲'WinMain',然後SDL2main庫中的'WinMain'作爲重複被丟棄,並且不會被引用,因此SDL_main不會被引用。 –

+0

不,libmingw32.a引用WinMain,並且找不到一個。ld連接器對庫命令很敏感,特別是當庫是靜態的時候。你的訂單是正確的,所以它鏈接;有問題的訂單不是。 – keltar

相關問題