2013-01-31 7 views
5

カメラのライブラリーに.soファイルを動的にロードして、簡単なカメラ機能にアクセスできるようにしようとしています。dlopen()を使って.soライブラリにアクセスすると、未定義のシンボルエラーが発生する

私はこれを行うためにしようとしています

if ((newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL) 
    { 
    printf("Could not open file : %s\n", dlerror()); 
    return 1; 
    } 

しかし、これは失敗し、私は次のような出力受信: "ファイルを開けませんでした:libCamera.so:未定義のシンボル:ZTVN10 _cxxabiv117__class_type_infoE" を

どのようなシンボルが頼りにしているのかはどうすればわかりますか?

答えて

10

libCamera.soは、そのライブラリにを依存することなく、共有ライブラリで定義されたシンボルを使用しています。

  1. 犯人を探します。 libCamera.soとリンクする実際の実行可能ファイルを用意してください(それは動作します)。依存関係をldd /path/to/executableでリストします。その中には、ZTVN10_cxxabiv117__class_type_infoEの定義を持つライブラリが必要です(可能性の高い候補を選択するにはgrep、ライブラリにはnm -Dを使用してください)。そのライブラリは、ldd ./libCamera.soで示されるリストにはが含まれません。

  2. 問題を解決します。手順1で見つかったライブラリを最初にdlopenでロードします(そこにはRTLD_GLOBALも使用してください)。新しく追加されたライブラリがあまりにも同じ問題を抱えている場合は

  3. は別のシンボルに問題がある、Gotoステップ1.

  4. がある場合は、Gotoステップ1.

  5. は彼らを修正喜ばせるために、ライブラリ作者に知らせますリンク。

またldd ./libCamera.soでの前提条件の一つがアップグレードされ、(多分それは違った名前マングリングを行い、コンパイラで再コンパイルされた)シンボル定義を失ってしまったことを発生する可能性があります。その後、ステップ1で犯人を見つけることはできません。解決策はありませんが、何かを再度ダウングレードしてください。

6

lddコマンドを使用すると、共有ライブラリの依存関係を表示できます。

ldd libCamera.so 

あなたが依存関係を知ったら、各ライブラリ内のシンボルを表示するためにnmを使用することができます。ほとんどの場合

nm -DC libCamera.so 
+0

'nm -DC libCamera.so'にリストされている関数を見ましたが、まだ定義されていませんでした。結局のところ、.hファイルで引数の1つがconst&.cppであることが判明しました。これはconstではなく、定義されていませんでした。 –

1

libCamera.soのソースコードには、未解決の外部シンボルがあります。つまり、type_infoEにはソースコードに定義がなく、解決する必要があります。

2

私にも同様の問題がありました。それは.aライブラリと関係していて、私の.soにリンクされていて、アーカイブには静的にリンクされているはずです。

nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE 
0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE 

Uここmeans thatシンボルが "未定義" である:

は、私が(ここで使用OPオブジェクト名)でこれを決定しました。これは、あなたが不足しているライブラリ把握に役立つはず

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 U abi::class_type_info(params...) 

(またはそのような何か):あなたは--demangleで不足しているオブジェクトのデマングル名を見つけることができます。

私の場合、ライブラリをコンパイラ行に含めた後でも、私はまだ問題がありました。最終的には、いくつかの工夫の後、私は、ライブラリ・ファイル(.a)ことを発見(.o)のようなファイルの依存オブジェクトの後に来ることがあります。今、私は(Uこれ以上)を取得しない

g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so 

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 T abi::class_type_info(params...) 

と私はもうエラーをそれ以上取得しないでください!

関連する問題