6

私はUbuntu11.04でfreeglutを使用するプログラムを書きました。それはうまくいきました。次に、別のコンピューターを入手して、Ubuntu11.04の新規インストールでプログラムを実行しようとしました。動作しません。だから私はインストールしました

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-common-dev gcc

インポートするプログラムを実行しようとしました



    #include <GL/freeglut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>

コマンドを使用する

g++ -lGL -lGLU -lglut Driver.cpp -o a

ただし、リンカーまたはフォームの200エラーのように吐き出すものは次のとおりです。



    Driver.cpp:(.text+0x3c6b): undefined reference to `glutSolidSphere'
    Driver.cpp:(.text+0x3c75): undefined reference to `glEnable'
    Driver.cpp:(.text+0x3c9a): undefined reference to `glColor4f'
    Driver.cpp:(.text+0x3cb5): undefined reference to `glRotatef'
    Driver.cpp:(.text+0x3d02): undefined reference to `glutSolidSphere'
    Driver.cpp:(.text+0x3d07): undefined reference to `glutSwapBuffers'

問題の原因は何ですか?

4

1 に答える 1

16

リンクするオブジェクト(静的ライブラリと動的ライブラリを含む)を指定する順序は重要です。

試してみてください:

g++ Driver.cpp -lGL -lGLU -lglut  -o a

(ライブラリの順序についてはわかりませんが、問題ないようです。)

コマンドラインを作成するときの考え方は、からの記号が必要な場合はa、コマンドラインのに表示する必要があるということです。bb a

--as-neededリンク順序の問題は、リンクフラグが設定されているかどうかに応じて、共有ライブラリのGCC / ldで発生します(または発生しません) 。(たとえば、Gentooの必要に応じた移行ガイドの最後の項目を参照してください。)
リンクプロセスは、アクティブなときに不要なシンボルをできるだけ早く削除します。--as-neededこれにより、リンクの順序が「正しくない」場合に問題が発生します。これは、最終的な実行可能ファイルに存在する不要な依存関係の数を減らすために行われます。
アクティブでない場合、これは発生しません(またはそれ以下)--as-needed-その場合、すべてのシンボルが保持され、リンクの順序はそれほど重要ではありません(多かれ少なかれ-繰り返しますが、私は専門家ではありません)。

ディストリビューションが異なれば、そのフラグに異なるデフォルトが使用されるため、GCCの動作に一貫性がないように見えるかもしれませんが、それは単なる印象です。

于 2012-04-03T20:43:22.023 に答える