Después de actualizar a 11.10, no puedo vincular el código con libgl/glut. freeglut3-dev, etc. están instalados y parece que también se pueden encontrar. Realmente no estoy seguro de lo que está pasando.
Archivo Make
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;
}
Producción
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
Al vincular con --verbose
attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib/libglut.so succeeded
Y luego, al verificar los símbolos en ese archivo
$ 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
Estoy muy confundido ahora.
Respuesta1
Funciona cuando coloco -lGLU -lGL -lglut al final de la llamada a gcc. Todavía estoy bastante seguro de que esto funcionó en el pasado.
Respuesta2
Tu Makefile
ya no funciona debido a untransición de cadena de herramientas(la transición fue planeada para natty pero el cambio que causa tu problema se realizó en onírico). La bandera del vinculador --as-needed
está activada de forma predeterminada en Ubuntu 11.10. Esto causa el problema que observaste. La solución es exactamente la que describiste en tu respuesta.
La
--as-needed
opción hace que el vinculador sea sensible al orden de las bibliotecas en la línea de comandos. Es posible que necesites mover algunas bibliotecas más adelante en la línea de comandos, para que aparezcan después de otras bibliotecas o archivos que requieran símbolos de ellas.