-2

これらの X11 + OpenGL の組み合わせの 1 つをコンパイルしようとしていますが、コンパイラがうまくいきません。特に、私は得る:

  undefined symbol: glXMakeCurrent

私が試してみました

   -lX11 -lGLU -lGL -lXext

リンカーへの引数として、およびそれらのいくつかの順列として、これまでのところ運がありません。

私はUbuntu 12.04を実行しています.openglに関連するすべての開発パッケージをインストールしましたが、あいまいな考えが関連している可能性があります。私はC++でも開発しています.openglヘッダーが準備されていないと問題を引き起こす可能性があります.しかし、それらは正しいですか?

/usr/lib/x86_64-linux-gnu/ で fgrep を使用してシンボルを明示的に探しましたが、そこにはありません。さらに、「nm」はシンボルがないと言っています。

では、glx とリンクする正しい方法は何ですか?

編集: リンクの問題です。Python がコンパイルされた (そして正しくリンクされていない) モジュールをロードしようとすると、エラーが発生します。コンパイル時ではありません。

編集:これがコンパイルログです

    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    g++ -o build/debug/objects/alve/layouter/flowing_data.os -c -std=c++0x -g -I/usr     /include/python2.7 -fPIC -I/opt/cairo_new/include/cairo/ -I/opt/boost_1_48_0/include -DMIC_RT_SPEED_BACKS -Icsrc csrc/alve/layouter/flowing_data.cpp
    g++ -o build/debug/objects/alve/layouter/liblayouter.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/flowing_data.os build/debug/objects/alve/layouter/show_network.os -Lbuild/debug/lib -Llibdeps
    Install file: "build/debug/objects/alve/layouter/liblayouter.so" as "build/debug/lib/liblayouter.so"
    g++ -o build/debug/objects/alve/layouter/liblayouter_mod.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/module.os  Lbuild/debug/lib -Llibdeps -lboost_python build/debug/objects/alve/layouter/liblayouter.so -lcairo -lX11 -lGL -lGLU -lXext
    scons: done building targets.

関数の呼び出し方法は次のとおりです。

glXMakeCurrent (dpy, win, ctx);
4

2 に答える 2

2

「未定義のシンボル」というメッセージは、それがリンカーではなく、コンパイル単位の問題であることを示しています。コンパイラは、シンボルglXMakeCurrentが宣言も定義もされていないため、シンボルを認識しませんが、使用します。

おそらくGLXヘッダーは含まれていません。

追加

#include <GL/glx.h>

OPの問題は、ビルドがPythonモジュールを形成するカスケード共有オブジェクトで構成されていたという事実に関連していることが判明しました。一方の共有オブジェクトは実際のOpenGL操作を実装し、もう一方はPythonインタープリターへのインターフェースを実行します。

これで、共有オブジェクト(.so)は、完全に修飾されたELFバイナリ自体になり、それぞれに独自のインポートおよびエクスポートシンボルテーブルがあります。共有オブジェクトは、リンク先の他の共有オブジェクトのすべてのシンボルを公開するように構成できます。ただし、共有オブジェクトには、リンク先のコンパイルユニットのシンボルは表示されません(共有オブジェクトは、想定される環境について想定することはできず、また想定すべきではないため、これは予想されることです。リンク先)。

したがって、大規模なビルドで複数の共有オブジェクトをコンパイルおよびリンクする場合は、実行時に必要となるライブラリに各共有オブジェクトを個別にリンクすることが重要です。

于 2012-10-23T09:48:29.050 に答える
0

@datenwolfのやり方として、リンクには特別な注意が必要です。それらは私にとって謎ですが、lddを使用すると役立ちます。つまり、基本的に私が行ったことは、最終共有オブジェクトと中間共有オブジェクトの両方でlddを使用することでした。コマンドライン引数にもかかわらず、中間ステップ('liblayouter.so'の生成)に'-lGL -lGLU -lX11'を含めるまで、ライブラリはlibGLおよびその依存関係にリンクされませんでした。

于 2012-10-23T13:02:48.967 に答える