3

次のシナリオが正確に何が起こるかを理解したいと思います。動的読み込みによって別の共有ライブラリ (B) をロードする共有ライブラリ (A) があります。ライブラリ A もいくつかのメソッド (F1) を公開しています。

主プログラムはライブラリー A をロードし、次にライブラリー A は後でライブラリー B をロードします。ライブラリ B がライブラリ A の関数 F1 を使用しようとすると、そのシンボルの読み込みに失敗し、警告/エラーやコアを表示せずにコンパイルがサイレント モードで停止します。ライブラリAからエクスポートされたこれらのシンボルを見ることができますが(nmコマンドを使用)。正確に何が起こっているのかよくわかりません。Linux.64でこれを観察しました。Windowsでも同じシナリオが機能します。

4

1 に答える 1

0

My psychic debugging powers tell me that because you tagged this as C++ you're compiling C++ code. I also guess that you used slightly different options to compile libraries A and B, causing their name decoration and/or ABI to be incompatible, and thus the method(s) can't be found.

Have you considered just letting the linker apply all the shared objects to your application rather than using dlopen? Then you'd know straight away that there was a problem because the linker couldn't match the symbols.

Alternately perhaps Linux just doesn't like your circular library references: can you refactor your libraries to eliminate the circular dependency?

于 2012-05-02T16:12:05.783 に答える