いくつかの共有ライブラリ(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を再度実行しようとすると、最初にexportコマンドを実行しない限り、同じエラーが発生します。 .bashrcに次を追加しようとしましたが、違いはありませんでした。
LD_LIBRARY_PATH="/path/to/library/"
つかいます
export LD_LIBRARY_PATH="/path/to/library/"
それ以外の場合は、.bashrcでbashのみが使用でき、起動したプログラムは使用できません。
リンクしているときに-R/path/to/library/
フラグを試してください。プログラムはそのディレクトリを検索するので、環境変数を設定する必要はありません。
編集:-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
別の方法は、このようなラッパーを使用することです
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
sync_test
が他のプログラムを起動する場合、それらは/path/to/library
のライブラリを使用する可能性があります。
これをすべて1行で入力できます。
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
根本的なものは何も変更しなくても、物事を少し簡単にする必要があります
.bashrcで「エクスポート」しましたか?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
実行時にライブラリ検索パスをLD_LIBRARY_PATHで上書きする代わりに、rpath
を使用してバイナリ自体にベイクすることができます。 GCCとリンクする場合は-Wl,-rpath,<libdir>
を追加するとうまくいきますが、ldとリンクする場合は-rpath <libdir>
になります。
システムにインストールしたものである場合は、共有ライブラリを含むディレクトリを/ etc/ld.so.confファイルに追加することもできます。または、 / etc/ld.so.conf.d /に新しいファイルを作成します
(RHEL5とUbuntuディストリビューションの両方をチェックしたので、Linuxの一般的なものだと思います)
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);
しかし、それが正確な解決策であることはわかりませんが、うまくいきます。
よろしく