なぜ私は、輸出と私は自分のアプリケーションを実行するたびにLD_LIBRARY_PATHを定義しなければなりませんか?

StackOverflow https://stackoverflow.com/questions/695530

質問

私はいくつかの共有ライブラリ(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.confldconfigを実行するためのパスを追加することです。これはすべて動的にリンクされたバイナリに適用されるグローバルな変更であることに注意してください。

他のヒント

あなたは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

それは根本的な何かを変更しない場合でも、物事は少し楽に行う必要があります。

代わりに、LD_LIBRARY_PATHと、実行時にライブラリの検索パスをオーバーライドする

、あなたの代わりに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解決すること、それを知りませんが、それは動作します。

よろしく

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top