更新到 11.10 后,我无法将代码链接到 libgl/glut。freeglut3-dev 等已安装,看起来也可以找到它们。我真的不知道发生了什么。
Makefile
gltest: gltest.cc
gcc -Wall -lglut -lGLU -lGL gltest.cc -o gltest
gltest.cc
#include <GL/glut.h>
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
//glutInitWindowSizendowSize(320,320);
glutCreateWindow("test");
return 1;
}
输出
jonas@fortress:~/dev/checkouts/test$ make
gcc -Wall -lglut -lGLU -lGL gltest.cc -o gltest
/tmp/cct1HevY.o: In function `main':
gltest.cc:(.text+0x1e): undefined reference to `glutInit'
gltest.cc:(.text+0x28): undefined reference to `glutInitDisplayMode'
gltest.cc:(.text+0x37): undefined reference to `glutInitWindowPosition'
gltest.cc:(.text+0x41): undefined reference to `glutCreateWindow'
collect2: ld returned 1 exit status
make: *** [gltest] Error 1
使用 --verbose 链接时
attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib/libglut.so succeeded
然后检查该文件中的符号
$ readelf -Ws /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib/libglut.so|grep glutInit
278: 000000000001dfc0 1581 FUNC GLOBAL DEFAULT 11 glutInit
我现在很困惑。
答案1
当我将 -lGLU -lGL -lglut 放在 gcc 调用的末尾时,它就可以正常工作。我仍然非常确定这在过去是有效的。
答案2
您的Makefile
不再工作,因为工具链转换(转换计划针对 natty,但导致您出现问题的更改是在 oneiric 中进行的)。--as-needed
默认情况下,Ubuntu 11.10 中启用了链接器标志。这会导致您观察到的问题。解决方案正是您在答案中描述的。
该
--as-needed
选项使链接器对命令行上库的顺序敏感。您可能需要在命令行中稍后移动一些库,以便它们位于需要其中符号的其他库或文件之后。