2

我试图在 msys 上使用 g++ 编译一个简单的 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...
....

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

4

1 回答 1

2

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

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

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

于 2013-09-17T11:53:01.267 回答