После обновления до 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
делает компоновщик чувствительным к порядку библиотек в командной строке. Возможно, вам придется переместить некоторые библиотеки позже в командной строке, чтобы они располагались после других библиотек или файлов, которым требуются символы из них.