OpenGLにリンクできなくなりました

OpenGLにリンクできなくなりました

11.10 にアップデートした後、libgl/glut に対してコードをリンクできません。freeglut3-dev などがインストールされており、それらも見つかるようです。何が起こっているのか本当にわかりません。

メイクファイル

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

gcc 呼び出しの最後に -lGLU -lGL -lglut を追加すると動作します。これは過去にも動作していたと確信しています。

答え2

あなたのMakefileはもう機能しませんツールチェーンの移行(移行は natty 向けに計画されていましたが、問題の原因となった変更は oneiric で行われました)。Ubuntu --as-needed11.10 では、リンカー フラグがデフォルトで有効になっています。これが、観察された問題の原因です。解決策は、回答で説明したとおりです。

この--as-neededオプションにより、リンカーはコマンドライン上のライブラリの順序を認識できるようになります。コマンドラインの後半でライブラリを移動して、それらのライブラリのシンボルを必要とする他のライブラリまたはファイルの後に来るようにする必要がある場合があります。

関連情報