2

別の共有ライブラリ (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 つが見つからない関数を呼び出します。(ありがとう - ハンク)

4

2 に答える 2

4

次のようにラッパーライブラリをリンクするときに依存関係を指定する必要があります

g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif

これを行うと、動的リンカーは libexif-wrapper が libexif に依存していることを認識し、ロード時にシンボルを解決できます。

于 2009-04-02T22:08:11.997 に答える
2

なぜあなたが必要なのか混乱していますが-lc、それはモノの奇妙なことかもしれません...

-lexifリンクコマンドに追加すると動作しますか?未定義のシンボルを使用して共有ライブラリを作成しているようですが、それらのシンボルがどこから来るべきかはわかりません。これは実際には便利な場合があります-たとえば、それをロードしているアプリケーションによって既に提供されていると予想されるシンボルを使用するプラグインを作成します-しかし、ここで必要なものではありません。ライブラリで使用するためにロードする必要があることをどのようにlibdl(またはMonoがライブラリをロードしますが、おそらく独自の実装を持っているか)わかりませんlibexif.so

libexif.soアーカイブに追加するような恐ろしいことをする必要がないことを願っています...

于 2009-04-02T22:07:43.810 に答える