なぜ私は、輸出と私は自分のアプリケーションを実行するたびにLD_LIBRARY_PATHを定義しなければなりませんか?
-
22-08-2019 - |
質問
私はいくつかの共有ライブラリ(GCCのCコード)を使用するいくつかのコードを持っています。コンパイルするとき、私は、彼らが標準の場所ではないので、明示的に、-Iや-Lを使用することを含む、ライブラリのディレクトリを定義する必要があります。私は、コードを実行しようとすると、私は次のエラーを取得する:
./sync_test
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
ただし、以下の操作を行い、すべてがうまく機能します:
export LD_LIBRARY_PATH="/path/to/library/"
./sync_test
さて、奇妙な部分があり、これは一度だけ動作します。私がしようとすると、再びsync_test実行すると、私は最初のエクスポートコマンドを実行しない限り、私は同じエラーを取得します。
:私は私の.bashrcに以下を追加してみましたが、それは何の違いが行われていませんLD_LIBRARY_PATH="/path/to/library/"
解決
使用
export LD_LIBRARY_PATH="/path/to/library/"
それ以外の場合は、あなたの.bashrcに、それだけであなたが開始するすべてのプログラムをbashのとないように利用できるようになります。
あなたがリンクしている-R/path/to/library/
フラグを試してみて、それがそのディレクトリ内のプログラムを見て作ってあげる、あなたはどのような環境変数を設定する必要はありません。
EDIT:-R
はSolarisのみで、そしてあなたは、Linuxにしているように見えます。
別の方法は/etc/ld.so.conf
とldconfig
を実行するためのパスを追加することです。これはすべて動的にリンクされたバイナリに適用されるグローバルな変更であることに注意してください。
他のヒント
あなたはLD_LIBRARY_PATH
で.bashrc
を設定することは避けてください。詳細については、 "Why LD_LIBRARY_PATH is bad
" のを参照してください。
リンカオプション -rpath に使用します動的リンカは、実行時にlibsync.so
を検索する場所を知っています。
gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
EDIT:
もう一つの方法は、このようなラッパーを使用することです。
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
sync_test
は、他のプログラムを起動した場合、彼らはあるいは意図してもしなくてもよい/path/to/library
でLIBSを使用して終わるかもしれない。
あなたの.bashrcに '輸出' をしましたか?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
あなただけのすべて1行でこれを置くことができます:
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
それは根本的な何かを変更しない場合でも、物事は少し楽に行う必要があります。
、あなたの代わりにrpath
とバイナリ自体にそれを焼くことができます。あなたは-Wl,-rpath,<libdir>
はトリックを行う必要があります追加GCCとリンクする場合は、LDとリンクする場合は、それだけで-rpath <libdir>
です。
何も行うことができ、それはあなたのシステムにインストールされて何かあれば、あなたのは/etc/ld.so.conf のファイルに共有ライブラリを含むディレクトリを追加、またはすることです新しいファイルの /etc/ld.so.conf.d / の
(私は両方のように私はそれがLinux用の一般的なことだと思うRHEL5とUbuntuディストリビューションをチェックしました)
のldconfigプログラムは、彼らがシステム全体に含まれていることを確認します。
詳細については、以下のリンクを参照してください。 www.dwheeler.com/secure-programs/Secure-Programs- HOWTO / dlls.htmlする
あなたは新しい定義で、あなたのコード内でコールシステムを追加することができます:
sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);
しかし、私はrigth解決すること、それを知りませんが、それは動作します。
よろしく