2012-05-02 31 views
3

正確に何が起こるかを次のように説明します。 私は動的ロードによって別の共有ライブラリ(B)をロードする共有ライブラリ(A)を持っています。 ライブラリAはいくつかのメソッド(F1)も公開しています。関数が実行されない

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

+2

これをどのようにコンパイルしようとしましたか? – qwertz

+1

ダイナミックライブラリの場合、コンパイラは何をそれに関係させますか?私はリンクを見ません.. – Nim

+0

彼が言った。ライブラリを自分でコンパイルしましたか?彼らは64ビットシステム上で動作していることを認識していますか?また、BはAの関数をどのように知っていますか? –

答えて

0

私の精神的なデバッグ能力は、これをC++とタグ付けしたので、C++コードをコンパイルしているからです。また、ライブラリAとBをコンパイルするために少し異なるオプションを使用して、名前の装飾やABIが互換性がなくなり、メソッドが見つかりませんでした。

dlopenを使用するのではなく、リンカーにすべての共有オブジェクトをアプリケーションに適用させることを検討しましたか?リンカがシンボルに一致しないため、問題があることをすぐに知ることができます。

おそらくLinuxはあなたの循環ライブラリ参照を好まないでしょう:循環依存関係をなくすためにあなたのライブラリをリファクタリングすることはできますか?

+0

ええ、私は自分のコードをリファクタリングしています。しかし、私は何がうまくいかなかったのか理解したかっただけです。 – Geek

関連する問題