Depois de atualizar para 11.10, não consigo vincular o código ao libgl/glut. freeglut3-dev etc. estão instalados e parece que também podem ser encontrados. Eu realmente não tenho certeza do que está acontecendo.
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;
}
Saída
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
Ao vincular com --verbose
attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib/libglut.so succeeded
E então, ao verificar os símbolos nesse arquivo
$ 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
Estou muito confuso agora.
Responder1
Funciona quando coloco -lGLU -lGL -lglut no final da chamada do gcc. Ainda tenho certeza de que isso funcionou no passado.
Responder2
Seu Makefile
não funciona mais por causa de umtransição do conjunto de ferramentas(a transição foi planejada para o natty mas a mudança que causa o seu problema foi feita no onírico). O sinalizador do vinculador --as-needed
é ativado por padrão no Ubuntu 11.10. Isso causa o problema que você observou. A solução é exatamente o que você descreveu em sua resposta.
A
--as-needed
opção torna o vinculador sensível à ordem das bibliotecas na linha de comando. Pode ser necessário mover algumas bibliotecas posteriormente na linha de comando, para que elas venham depois de outras bibliotecas ou arquivos que exijam símbolos delas.