无法再链接到 opengl

无法再链接到 opengl

更新到 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选项使链接器对命令行上库的顺序敏感。您可能需要在命令行中稍后移动一些库,以便它们位于需要其中符号的其他库或文件之后。

相关内容