別の共有ライブラリ (libexif) の関数を呼び出し、Platform Invoke 呼び出し用の C# への単純なインターフェイスを提供する shim ライブラリ (共有、C++) があります。(つまり、C# プログラムは PInvoke を使用して、別の共有ライブラリを呼び出すカスタム共有ライブラリを呼び出します。)
Windows では、カスタム ライブラリがリンクするときにカスタム共有ライブラリが共有ライブラリにリンクし、C# アプリケーションが実行されると、すべてのシンボルが解決されます。
Linux で、自分の共有ライブラリをリンクしても、他の共有ライブラリはリンクされません。C++ ドライバーでは、アプリケーションのリンク時に他のライブラリを指定し、その時点ですべてのシンボルが解決されます。ただし、共有ライブラリを C# プログラム (mono を使用してコンパイル) から呼び出そうとすると、他の共有ライブラリのシンボルが解決されません。MONO_PATH 変数を使用して他のライブラリを指定しようとしましたが、違いはないようです。また、未解決の関数を DLLimport ステートメントで指定しようとしましたが、それも役に立たないようです。
mono/cli が実行時に見つけられるように、C# コードによって直接呼び出されない共有ライブラリを指定するにはどうすればよいですか?
次のコマンドを使用して、共有ライブラリを構築します。
g++ -fPIC -g -c -Wall libexif-wrapper.cpp
g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc
ar rcs libexif-wrapper.a libexif-wrapper.so.1
そして、次のコマンド ラインで C# ドライバーをコンパイルします。
mcs -unsafe -define:LINUX Test-libexif-wrapper.cs
実行時に、共有ライブラリで使用されているシンボルが見つからないというエラーが表示されます。
/usr/bin/cli: symbol lookup error: ../../../C/libexif-wrapper/libexif-wrapper/libexif-wrapper.so.1: undefined symbol: exif_data_new_from_file
(libexif-wrapper は、C# アプリケーションと libexif の間のシムとして機能する私の共有ライブラリです。)
これを解決する方法を理解できませんでした。任意の提案をいただければ幸いです。
編集:質問に答えるには:
管理されていない libexif-wrapper が LD_LIBRARY_PATH 環境変数にあることを確認できますか?
実際、そうではありません。代わりに、DLLImport のパスを直接指すように作成しました。ランタイムは、上記のエラー メッセージでそのパスを報告するので、それを見つけます。さらに、不足しているシンボルは C# プログラムによって呼び出されるのではなく、共有ライブラリ内の関数の 1 つが見つからない関数を呼び出します。(ありがとう - ハンク)