無法再連結到 opengl

無法再連結到 opengl

更新到 11.10 後,我無法將程式碼連結到 libgl/glut。 freeglut3-dev等已經安裝了,看起來也能找到。我真的不確定發生了什麼事。

產生檔案

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-neededUbuntu 11.10 中預設啟動連結器標誌。這會導致您觀察到的問題。解決方案正是您在答案中所描述的。

--as-needed選項使連結器對命令列上庫的順序敏感。您可能需要稍後在命令列中移動一些庫,以便它們位於需要其中符號的其他庫或檔案之後。

相關內容