2013-09-16 36 views
2

我想在msys上使用g ++編譯一個簡單的opengl程序。令我驚訝的鏈接器抱怨未定義引用:奇怪的g ++鏈接行爲取決於參數順序

$ g++ -mwindows -lopengl32 glut_md2.cpp 
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x67a): undefined reference to `[email protected]' 
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x696): undefined reference to `[email protected]' 
.... 

Google上搜尋了一段時間後,我發現這個問題是在G ++參數命令:

$ g++ glut_md2.cpp -mwindows -lopengl32 
--- all ok! --- 

有趣的是,正確的說法訂單在g ++中是第一個例子。那就是:

$ g++ --help 
Usage: g++.exe [options] file... 
.... 

我錯過了什麼嗎?爲什麼在之後移動選項文件參數使編譯成功?我在linux上本地編譯時從來沒有遇到過這個問題......

回答

2

我碰到這個問題一兩次,你應該把-L和-l放在命令行的末尾。克++沒有鏈接,它調用LD和傳遞參數,LD男人:

鏈接器將搜索歸檔,只有一次,在它是 在命令行上指定的位置。如果歸檔文件定義了一個符號 ,該符號在命令行上的歸檔文件 之前出現的某個對象中未定義,則鏈接器將從歸檔文件中包含相應的文件 。但是,稍後在命令行中出現 的對象中的未定義符號將不會導致鏈接程序再次搜索 存檔。

LD -o /lib/crt0.o hello.o -lc

+0

奇怪。我認爲g ++應該以任何方式將鏈接選項傳遞給鏈接器,因爲它在上面的示例中非常明確。巫術魔法...... – gundra