更新到 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-needed
Ubuntu 11.10 中預設啟動連結器標誌。這會導致您觀察到的問題。解決方案正是您在答案中所描述的。
此
--as-needed
選項使連結器對命令列上庫的順序敏感。您可能需要稍後在命令列中移動一些庫,以便它們位於需要其中符號的其他庫或檔案之後。