47

いくつかの共有ライブラリ (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/"
4

7 に答える 7

47

での設定は避ける必要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性があります。

于 2009-03-30T00:20:00.300 に答える
44

使用する

export LD_LIBRARY_PATH="/path/to/library/"

それ以外の場合は、bash でのみ使用でき、開始したプログラムでは使用できません。

リンクするときにフラグを立ててみてください-R/path/to/library/。プログラムがそのディレクトリを参照するようになり、環境変数を設定する必要がなくなります。

編集:-RSolarisのみのようで、Linuxを使用しています。

別の方法は、にパスを追加して/etc/ld.so.conf実行することldconfigです。これは、動的にリンクされたすべてのバイナリに適用されるグローバルな変更であることに注意してください。

于 2009-03-29T22:46:01.353 に答える
11

これをすべて1行に入れることができます:

LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test

基本的なことは何も変わらなくても、物事を少し簡単にする必要があります

于 2009-03-29T23:12:29.307 に答える
10

.bashrc で「エクスポート」しましたか?

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
于 2009-03-29T22:44:32.260 に答える
5

実行時にライブラリ検索パスを LD_LIBRARY_PATH でオーバーライドする代わりに、rpath. GCC でリンクする場合は追加-Wl,-rpath,<libdir>でうまくいくはずです。ld でリンクする場合は-rpath <libdir>.

于 2012-08-07T15:58:03.017 に答える
2

システムにインストールしたものであれば、共有ライブラリを含むディレクトリを/etc/ld.so.confファイルに追加するか、/etc/ld.so に新しいファイルを作成することもできます。 conf.d/

(RHEL5とUbuntuディストリビューションの両方をチェックしたので、Linuxでは一般的だと思います)

ldconfig プログラムは、それらがシステム全体に含まれていることを確認します。

詳細については、次のリンクを参照してください: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html

于 2009-03-30T07:03:41.203 に答える
1

新しい定義を使用して、コードに呼び出しシステムを追加できます。

sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);

しかし、それが正しい解決策かどうかはわかりませんが、機能します。

よろしく

于 2016-10-24T21:36:49.717 に答える