2013-09-16 27 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