Nach dem Update auf 11.10 kann ich keinen Code mit libgl/glut verknüpfen. freeglut3-dev usw. sind installiert und es sieht so aus, als ob sie auch gefunden werden können. Ich bin mir wirklich nicht sicher, was los ist.
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;
}
Ausgabe
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
Beim Verknüpfen mit --verbose
attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib/libglut.so succeeded
Und dann beim Überprüfen der Symbole in dieser Datei
$ 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
Ich bin jetzt sehr verwirrt.
Antwort1
Es funktioniert, wenn ich -lGLU -lGL -lglut ans Ende des gcc-Aufrufs setze. Ich bin mir immer noch ziemlich sicher, dass das in der Vergangenheit funktioniert hat.
Antwort2
Ihr Makefile
funktioniert nicht mehr wegen einerToolchain-Übergang(der Übergang war für Natty geplant, aber die Änderung, die Ihr Problem verursacht, wurde in Oneiric vorgenommen). Das Linker-Flag --as-needed
ist in Ubuntu 11.10 standardmäßig aktiviert. Dies verursacht das von Ihnen beobachtete Problem. Die Lösung ist genau das, was Sie in Ihrer Antwort beschrieben haben.
Die
--as-needed
Option macht den Linker empfindlich gegenüber der Reihenfolge der Bibliotheken in der Befehlszeile. Möglicherweise müssen Sie einige Bibliotheken später in der Befehlszeile verschieben, damit sie nach anderen Bibliotheken oder Dateien kommen, die Symbole von ihnen benötigen.