7

通常、プログラム(Linuxの場合)はLD_LIBRARY_PATHを使用して共有ライブラリを検索しますが、LD_LIBRARY_PATHを永続的に変更せずに、カスタムパスを使用したいと思います。

基本的に、bash-wrapperはそれを簡単に実現できます。

#!/bin/sh
export LD_LIBRARY_PATH=/my_lib_path/
/my_bin_path/myprogram $*

(Bashはこのスクリプト内のLD_LIBRARY_PATHのみを変更し、永続的には変更しません)

醜いbash-hackを使わずに、純粋なCで同じことを1つの実行可能ファイルで実行できるかどうか疑問に思いました。すべてのパスとライブラリの正確な名前は、コンパイル時にわかります。

4

4 に答える 4

6

-rpathオプションをld、 または にコンパイラ経由で渡します-Wl,-rpath。検索パスを拡張できます。プラグインディレクトリからモジュールをロードしたい実行可能ファイルで一般的に使用されます。この方法を使用して、必要な数のディレクトリを追加できます。

于 2012-12-30T17:03:07.237 に答える
4

実行時に変更することはできませんLD_LIBRARY_PATH。動的ローダーは、プログラムの実行時に一度読み取り、二度とチェックしません。代わりにdlopen()を使用して、共有ライブラリを自分でロードできます。

dlopen("/path/to/shared/lib.so", RTLD_LAZY);

これは、ライブラリをロードしdlsym()て実行時にシンボルを検索する場合にのみ機能します。それ以外の場合、ライブラリ内の関数を呼び出す場合、これらの参照はロード時に解決する必要があり、AFAIK では bashscript などを使用する必要があります。

注:LD_LIBRARY_PATHプロセスを再実行すると、実行時に変更することができます。これをテストしたところ、機能しているように見えますが、非常にハックであり、C.

void *handle;
// first time check if path is not set
if (getenv("LD_LIBRARY_PATH")==NULL) {
    //set it and re-execute the process
    setenv("LD_LIBRARY_PATH", "/path/to/lib/", 1);
    execl(argv[0], argv[0], NULL);
}
// open the shared library the second time
handle = dlopen("test.so", RTLD_LAZY);
printf("%p\n", handle);
dlclose(handle);
于 2012-12-30T17:02:39.910 に答える
4

他の人が言ったように、プログラムをリンクするとき-Wl,-rpathに、アプリケーションのライブラリ検索パスに特定のパスを追加するために使用できます。-lただし、特定のライブラリのパスをハードコーディングするだけの場合は、オプションを使用するのではなく、リンク時にそれを使用してください。たとえば、 の代わりに、リンク コマンド ラインで-lfoo使用します。/opt/foo/lib/libfoo.so.1

于 2012-12-30T17:07:40.143 に答える
0

私はこれが実行時に可能だとは思わない: ライブラリはプログラムを実行する前にロードされます...

-rpathただし、オプションをリンカーに渡すことにより、コンパイル時にそれを行うことができます

于 2012-12-30T17:03:22.633 に答える