2014-07-05 59 views
1

我在SDL中邁出的第一步非常辛苦。 我想編寫一個簡單的測試類,只包括SDL2頭,沒有什麼特別的啓動:在本地環境中使用SDL編譯的'WinMain'未定義引用

main.cpp中:

#include <SDL.h> 

int main() { 
    return 0; 
} 

的main.cpp本身編譯罰款: g++ -c main.cpp -ISDL/include

但只要我想要將其與機器碼main.o或直接鏈接到SDL2.dll,我得到這個錯誤: g++ main.cpp -o sdl_test -I SDL/include -L SDL/lib/x64 -l SDL2 -mwindows g++ -o test main.o -L SDL/lib/x64 -l SDL2 -mwindows

/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/libcygwin.a(libcmain.o): In function `main': 
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain' 
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain' 
collect2: Fehler: ld gab 1 als Ende-Status zurück 

附加信息: 我使用Cygwin和顯然g ++來編譯我的C++代碼。我的操作系統是Windows 7專業版64位SP 1。

我搜索了幾個小時,但所有結果我碰到說,使用-mwindows來編譯非控制檯應用程序或其他事情沒有解決。

由於提前

+0

他們重新定義了'main'一些非常討厭的東西宏。在include之後試試'#undef main'來看看是否是這種情況。如果是這樣,那麼在SDL頭文件中找到定義,在這裏解釋它們如何讓人們禁用定義,並使用SDL方式來轉換該sh * t。 –

+0

順便說一句,'-mwindows'只是指定Windows子系統並添加了一些Windows API導入庫。它與「其他不起作用的東西」無關。爲你的編譯器獲得這個選項的更詳細的視圖,在「mwindows」上執行'-dumpspecs'和過濾。 –

+0

'#include #undef main'仍然不起作用,但標題不能成爲問題。正如我所說,文件本身與頭部編譯很好,但只要我嘗試鏈接他們,我得到這個異常 – Matze

回答

1

當你使用SDL,您main()必須看起來像int main(int, char **)(或int main(int argc, char **argv))。

爲什麼?因爲,地方SDL代碼中,你可以找到

int SDL_main(int, char **); 

int main(int argc, char **argv) 
{ 
    /*Some stuff.*/ 

    SDL_main(argc, argv); 

    /*Some stuff.*/ 
} 

,然後裏面SDL.h

#define main SDL_main 
+0

兒子所有我必須做的,就像@ Cheersandhth.-Alf建議,只是使用'int main(int argc,char * argv [])'作爲我的主要功能? – Matze

+0

是的。 (還有一些其他解決方案,但它是最簡單的一個。) – HolyBlackCat

+0

我剛剛注意到在本地環境中編碼的缺點......'#undef main'變體某種程度上可行......但不添加'#undef main''##包括 //#undef main int main(int argc,char * argv []){ \t return 0; }'再次編譯錯誤 – Matze

相關問題