共有ライブラリの読み込み中にエラーが発生しました。

共有ライブラリの読み込み中にエラーが発生しました。

私のプロジェクトツリーは次のとおりです。

src/
include/
Makefile
lib/
   lib/3rdparylib/

私はコーディングしませんが、3rdpartylibソースコードをプロジェクトパッケージに含めることにしました。次の手順を実行してソフトウェアをコンパイルしました。

$ cd lib/3rdpartylib/
$ make
$ ln -s 3rdpartylib.so.0 3rdpartylib.so

次に、それぞれをコンパイルします。私のものソースファイルは次のとおりです。

$ gcc -c src/file.c -I include -o file.o -l 3rdparylib -L lib/3rdpartylib -I lib/3rdpartylib/include

次に、次を接続します。

$ gcc file1.o file2.o -l3rdpartylib -L lib/3rdpartylib -o myapp

私がホストにいるときはうまくいきます。今日は別のコンピュータで起動しようとしました。問題なくコンパイルされリンクされます。ただし、アプリケーションを実行しようとすると、次のエラーメッセージが表示されます。

./myapp: 共有ライブラリの読み込みエラー: 3rdpartylib.so.0: 共有オブジェクト ファイルを開けません。そのファイルまたはディレクトリはありません。

私は以下を試してみます:

export LD_LIBRARY_PATH=/path/to/3rdpartylib.so

うまくいくようです。しかし、LD_LIBRARY_PATHを使用するのは悪い習慣であることを知っています。アプリケーションを実行するたびにこの変数を設定する必要があるのは面倒です。

私は何を見逃していますか?私のホストでは動作しますが(LD_LIBRARY_PATHは何も設定されていません)、他のコンピュータでは動作しないのはなぜですか?他のマシンが仮想マシンかどうかは重要ですか?

役に立つ場合、私のメインコンピュータはDebianコンピュータで、私の「新しい」コンピュータはVirtualboxで実行されているSabayon(Gentoo)です。

答え1

重要なのは、各マシンがライブラリパスを異なる方法で処理するため、どのLinuxディストリビューションを使用しているかです。 Gentoo(Sabayon)システムでシステム全体でサードパーティのライブラリを使用するには、次の手順を実行する必要があります。

  • /etc/env.d/追加の設定を含むこのファイルの下にファイルを作成します。ファイル名はこのスキームを使用して指定されます[0-9][0-9]somename。 2 つの初期数字が使用される順序を決定します。良い方法は、カスタム設定(近く)を追加することです。最後99動作する限り、これは正しい開始です。タイトルへ:次の名前のファイルを作成します。

    /etc/env.d/99mythirdpartylib
    

    含む

    LDPATH=/path/to/your/library
    
  • 再起動せずに変更を適用するには、root として実行します。

    env-update && source /etc/profile
    

    (これにより、環境が更新され実行されますldconfig)。

引用する、あなたが望むなら。

答え2

この方法を使用してシステム全体のグローバルライブラリ検索パスを設定したくない場合は、次のようにし/etc/env.dます。

ただLD_LIBRARY_PATH変えてくださいライブラリの設定(ライブラリ自体に設定しても効果はありません)は、-Lgccパラメータで設定したものと同じです。

export LD_LIBRARY_PATH="$PROJ/lib/3rdpartylib/:$LD_LIBRARY_PATH"

(最後の部分は、変数が設定されている場合はそれを保存するために使用されますが、通常はそうしないでください。) これは現在のシェルでのみ機能し、毎回リセットする必要があります。

または、次のように「静的」ライブラリ検索パスを使用してリンクします。

gcc file1.o file2.o -L./lib/3rdpartylib -Wl,-rpath=./lib/3rdpartylib  -l3rdpartylib  -o myapp

-Wlgccで処理されずにリンカに渡されるコマンドライン引数を指定します。 ライブラリ検索パスはバイナリに書き込まれるため、他のコンピュータでも機能します(ライブラリが存在する限り)。

添付:ただプロジェクトを開発している状況についてお話ししたので、システム全体の構成ファイルに入れるよりも、これらの一時的なアプローチがより適切だと思います。

答え3

銀行:

$ gcc file1.o file2.o -l3rdpartylib -L lib/3rdpartylib -o myapp

lib3rdpartylib.so含まれていないライブラリパス内のファイルを検索してくださいlib/3rdpartylib。 gccのマニュアルページを見ると、ライブラリパスを指定するときにフラグの前に-L来る必要があり、そうでなければ検索されないことが示されています。-l実際に最も簡単な解決策は、ライブラリ自体にリンクすることです。

$ gcc file1.o file2.o lib/3rdpartylib/3rdpartylib.so -o myapp

これにより、ライブラリパスからライブラリが検索され、実行時にmyapp動的にロードされます。

確認したい場合は、strace -eopen ./myappインストール後に一度だけ試して、どこからライブラリをロードしようとしているのかを確認してください。

答え4

システムにライブラリを見つける場所を教えてください。これはによって行われます/etc/ld.so.cache。からライブラリまたはディレクトリ全体を追加できます/etc/ld.so.conf

次のようにしてキャッシュを書き換えることができます。

# /sbin/ldconfig -v

関連情報