奇怪的g ++链接行为取决于参数顺序

时间:2013-09-16 12:21:57

标签: reference g++ undefined msys

我试图使用g ++在msys上编译一个简单的opengl程序。令我惊讶的是,链接器抱怨未定义的引用:

$ g++ -mwindows -lopengl32 glut_md2.cpp
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x67a): undefined reference to `glGenTextures@8'
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x696): undefined reference to `glBindTexture@8'
....

谷歌搜索了一段时间后,我发现问题出在g ++参数顺序中:

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

有趣的是,g ++中正确的参数顺序是第一个例子。那就是:

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

我错过了什么吗?为什么在文件参数之后移动选项会使编译成功?在linux上本地编译时我从未遇到过这个问题...

1 个答案:

答案 0 :(得分:2)

我碰到这个问题一两次,你应该把-L和-l放在命令行的末尾。 g ++没有链接,它调用ld并传递参数,ld man:

  

链接器将仅在存档位置搜索一次存档   在命令行中指定。如果存档定义了符号   在归档之前出现的某个对象中未定义   在命令行上,链接器将包含相应的文件   来自档案馆。但是,出现的对象中存在未定义的符号   稍后在命令行上不会导致链接器搜索   再次存档。

     

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