web-dev-qa-db-ja.com

アプリケーションを実行するたびに、LD_LIBRARY_PATHをエクスポートで定義する必要があるのはなぜですか?

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

つかいます

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

それ以外の場合は、.bashrcでbashのみが使用でき、起動したプログラムは使用できません。

リンクしているときに-R/path/to/library/フラグを試してください。プログラムはそのディレクトリを検索するので、環境変数を設定する必要はありません。

編集:-RはSolarisのみで、Linuxを使用しているようです。

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

42
brian-brazil

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のライブラリを使用する可能性があります。

44
sigjuice

これをすべて1行で入力できます。

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

根本的なものは何も変更しなくても、物事を少し簡単にする必要があります

10
unwesen

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
10
bedwyr

実行時にライブラリ検索パスをLD_LIBRARY_PATHで上書きする代わりに、rpathを使用してバイナリ自体にベイクすることができます。 GCCとリンクする場合は-Wl,-rpath,<libdir>を追加するとうまくいきますが、ldとリンクする場合は-rpath <libdir>になります。

4
fgp

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

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

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

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

2
Roalt

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

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

しかし、それが正確な解決策であることはわかりませんが、うまくいきます。

よろしく

1
user3916212