12

カメラ ライブラリ .so ファイルを Linux 実行可能ファイルに動的にロードして、単純なカメラ機能にアクセスしようとしています。

私はこれをやろうとしています:

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

ただし、これは失敗し、次の出力が表示されます。

どのシンボルに依存しているかを調べるにはどうすればよいですか?

4

4 に答える 4

17

ほとんどの場合、共有ライブラリに依存libCamera.soせずに、共有ライブラリで定義されたシンボルを使用します。

  1. 犯人を探す。リンクするlibCamera.so(そしてそれが機能する)実際の実行可能ファイルを取ります。その依存関係をでリストしldd /path/to/executableます。それらの中には、(確実にライブラリ上で、可能性のある候補を選択するためにZTVN10_cxxabiv117__class_type_infoE使用する)の定義を持つライブラリが必要です。そのライブラリは、で示されるリストには含まれませんgrepnm -Dldd ./libCamera.so

  2. 問題を解決する。dlopen手順1で見つかったライブラリを最初にロードします(RTLD_GLOBALそこでも使用します)。

  3. 別のシンボルに問題がある場合は、手順1に進みます。

  4. 新しく追加したライブラリにも同じ問題がある場合は、手順1に進みます。

  5. 図書館の作者に、リンクを修正してくださいと伝えてください。

また、の前提条件の1つldd ./libCamera.soがアップグレードされ、シンボル定義が失われる可能性もあります(名前のマングリングが異なるコンパイラーを使用して再コンパイルされた可能性があります)。そうすれば、ステップ1で原因を見つけることができず、解決策はありませんが、何かを再度ダウングレードします。

于 2013-01-31T10:52:38.110 に答える
10

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

ldd libCamera.so

依存関係がわかったら、 を使用nmして各ライブラリのシンボルを表示できます。

nm -DC libCamera.so
于 2013-01-31T10:48:49.010 に答える
6

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

私はこれを(ここで使用されるOPオブジェクト名)で決定しました:

nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE
0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE

Uhere、シンボルが「未定義」であることを意味します。不足しているオブジェクトのデマングリングされた名前は、次のコマンドで見つけることができます--demangle

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

(またはそのようなもの)これは、どのライブラリが欠落しているかを把握するのに役立ちます。

私の場合、コンパイラ行にライブラリを含めた後でも、まだ問題がありました。最終的に、いじくり回した後、次のように、ライブラリ ファイル ( ) がその依存オブジェクト ( ) ファイルの.a後に来る必要があることを発見しました。.o

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

今私は得ます(これ以上U):

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

そして最も重要なことは、エラーが発生しなくなったことです。

于 2015-05-01T08:23:50.690 に答える
1

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

于 2013-06-22T09:36:34.860 に答える