Kann nicht mehr mit OpenGL verknüpfen

Kann nicht mehr mit OpenGL verknüpfen

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 Makefilefunktioniert 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-neededist 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-neededOption 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.

verwandte Informationen