0

作成した DLL を使用してコードをコンパイルしようとしていますが、書き込み時に以下のエラーが発生します。./prog

./prog: 共有ライブラリの読み込み中にエラーが発生しました: libctest.so.1: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

私はこちらのチュートリアルに従いましたが、モノラル アプリは dll の読み込みと関数の呼び出しに問題はありません。チュートリアルの重要な部分は

gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
mv libctest.so.1.0 /opt/lib
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so

私のC#コードは

[DllImport("path/to/CDLL", CallingConvention = CallingConvention.Cdecl)]
public static extern void test();

で構築しました

gcc -Wall -L/opt/lib main.c -lctest -o prog

これは私が最初に変更したことです。prog.c から main.c へ。そこから./prog、この質問の上部にあるエラーを取得するために単純に実行します。これはルートとして行うため、権限の問題は発生しません。私もそのようにchmod 755しました。私は何を間違っていますか?オープンユースです。を作成する必要があったため、/opt/libこのパスが本来あるべき場所に登録されていないと考えています

4

1 に答える 1

3

ライブラリの依存関係を解決しようとするとき、動的リンカーはデフォルトld.soでは検索しません。/opt/lib非標準のライブラリ ディレクトリについてリンカーに伝えるか/opt/lib、バイナリへのパスを追加する必要がありますprog

例えば

LD_LIBRARY_PATH=/opt/lib ./prog

またはリンカーオプションでリンクprogしてください。-rpathこれにより、リンカーが共有オブジェクトの場所を解決するときに検索する追加のパスが提供されます。

gcc -Wall -L/opt/lib -Wl,-rpath,/opt/lib main.c -lctest -o prog

バイナリでコマンドを使用してldd、共有ライブラリの場所を表示できます。

ldd prog

これは、現在libctest.so見つからないことを示します。追加の検索パスを使用すると、次のコマンドですべてのライブラリが解決されていることが示されます。

LD_LIBRARY_PATH=/opt/lib ldd prog
于 2013-03-11T00:10:43.567 に答える