私のプロジェクトツリーは次のとおりです。
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
変えてください道ライブラリの設定(ライブラリ自体に設定しても効果はありません)は、-L
gccパラメータで設定したものと同じです。
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
-Wl
gccで処理されずにリンカに渡されるコマンドライン引数を指定します。
ライブラリ検索パスはバイナリに書き込まれるため、他のコンピュータでも機能します(ライブラリが存在する限り)。
添付:ただプロジェクトを開発している状況についてお話ししたので、システム全体の構成ファイルに入れるよりも、これらの一時的なアプローチがより適切だと思います。
答え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