適切な(システムのバージョンとは異なる)バージョンのライブラリが使用されるように環境を構成する方法

適切な(システムのバージョンとは異なる)バージョンのライブラリが使用されるように環境を構成する方法

この質問は、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_PATHCPLUS_INCLUDE_PATH

答え1

環境変数のみを使用してこれを確実に実行する方法はないと思います。 を使用する場合の問題は、特定のオプションが優先されるLIBRARY_PATHことです。何らかの理由でコマンドに が含まれている場合、これが最初に検索され、ライブラリの古いバージョンが見つかります。 Makefile を変更する予定のようですが、 が最初に表示されないように注意する必要があります。-Lgcc-L/usr/lib64-L/usr/lib64

しかし、SO の質問を見ると、上記は問題ではないようです。ただし、変数:の値に不要な末尾がありLIBRARY_PATH、それが機能しなかった理由かもしれません。

また、SOの質問への回答に記載されているように、LD_LIBRARY_PATH動的リンカーによって使用され、ランタイムアプリケーションに対して を使用します。これは、アプリケーションの実行時に動的ライブラリの場所が見つからない場合に使用できます。GNU リンカーによって使用されるのは でLD_RUN_PATH、これは基本的に に対して が行うことと同じことを行います-rpathLIBRARY_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

関連情報