私は持っている:
- アプリケーションA
- 動的ライブラリD
- 静的ライブラリS
どこ:
- A は、コンパイル時に静的ライブラリ S とリンクされます。
- D は S をリンクせずにコンパイルされますが、そのヘッダー ファイルを使用します
- A は
dlopen
、実行時に D をロードするために使用します。
コンパイル時に D を S にリンクせずに、A で実行するときに D が S で定義されたシンボルを使用することは可能ですか? つまり、D はグローバル名前空間のシンボルにアクセスできますか?
その他の注意事項: S から関数を呼び出すには、D と A の両方が必要です。理想的には、S を変更したくありません。
これを試してみたところ、次のようになりました(SのシンボルがDで使用されている場合):
dyld: lazy symbol binding failed: Symbol not found: __Z14myFunctioni
これは次のいずれかであると思います。
- 既存の関数 'myFunction(int)' は共有ライブラリで使用できません (セキュリティ?)
- この関数のシンボル名は、別の方法でマングルされた名前になっています (編集: テストし
extern "C"
てこれを除外しました)。
おそらく、別の設定でコンパイルする必要がありますか、それとも常にすべての S を D にリンクする必要がありますか? また、S が動的ライブラリそのものになったら、状況は変わりますか?
ありがとうございました