
この質問は、ServerFault と StackOverflow とこのサイトの境界線上にあると思います。しかし、U&L が最も関連性が高いと思います。
C++
バージョンのライブラリに依存するコードがありX
、システムはバージョンY
(X>Y) を提供します。このライブラリをコンパイルし、結果のファイルを に配置しました。/opt/lib_name/X/lib
バージョンY
は にインストールされてい/usr/lib64
ます。ライブラリに対してリンクしたいと考えていますso
。
X
ここで、何らかの方法でバージョンを有効にするスクリプトを作成し、ビルドするすべてのコードが、makefile に変更を加えずにgcc
バージョンに対してコンパイルされるようにしたいと思います。X
今のところ、LIBRARY_NAME_DIR
変数を設定し、makefile に を追加するだけです-L $LIBRARY_NAME_DIR
。これは機能しますが、makefile を変更する必要があります。
コンピューターのルートアクセス権を持たずに、このようなことを実行する方法はありますか。
注: この質問への回答は特定のライブラリやコードに依存しないと考えていますが、私の特定の問題に関する詳細はすべてここにあります:https://stackoverflow.com/q/24189130/7918。
私が試したこと:
- 設定しました:
LIBRARY_PATH
、、LD_LIBRARY_PATH
。CPLUS_INCLUDE_PATH
答え1
環境変数のみを使用してこれを確実に実行する方法はないと思います。 を使用する場合の問題は、特定のオプションが優先されるLIBRARY_PATH
ことです。何らかの理由でコマンドに が含まれている場合、これが最初に検索され、ライブラリの古いバージョンが見つかります。 Makefile を変更する予定のようですが、 が最初に表示されないように注意する必要があります。-L
gcc
-L/usr/lib64
-L/usr/lib64
しかし、SO の質問を見ると、上記は問題ではないようです。ただし、変数:
の値に不要な末尾がありLIBRARY_PATH
、それが機能しなかった理由かもしれません。
また、SOの質問への回答に記載されているように、LD_LIBRARY_PATH
動的リンカーによって使用され、ランタイムアプリケーションに対して を使用します。これは、アプリケーションの実行時に動的ライブラリの場所が見つからない場合に使用できます。GNU リンカーによって使用されるのは でLD_RUN_PATH
、これは基本的に に対して が行うことと同じことを行います-rpath
がLIBRARY_PATH
、-rpath
を指定すると は-rpath
無視LIBRARY_PATH
されます (優先順位が低くなるだけではありません)。
その場合、次のことを試してください。
LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make
より堅牢な方法としては、gcc
必要なオプションを含むラッパー スクリプトを作成することです。例:
#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"
ファイルに名前を付けgcc
、実行可能にして、それを専用のディレクトリ (または少なくとも重要なコマンドと同じ名前のファイルがないディレクトリ) に配置します。次に、make
次のように実行します。
PATH=/path/to/script:$PATH make