正しい(システムバージョンとは異なる)ライブラリバージョンを使用するように環境を設定するにはどうすればよいですか?

正しい(システムバージョンとは異なる)ライブラリバージョンを使用するように環境を設定するにはどうすればよいですか?

この問題は、ServerFaultとStackOverflow、およびこのサイト間の境界の問題のようです。しかし、私はU&Lが最も関連性が高いと思います。

C++version のライブラリに依存するコードがあり、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オプションが優先順位を持つことです-L。何らかの理由で対応するgccコマンドがある場合は、-L/usr/lib64そのコマンドを最初に検索してから、以前のバージョンのライブラリを見つけます。 Makefileを変更したいようです。-L/usr/lib64まず、aが表示されないことにも注意してください。

しかし、あなたの質問によると、上記は問題ではないようです。ただし、変数の:値に不要な末尾があり、機能しないLIBRARY_PATH理由を説明できます。

また、SOの質問への回答で指摘したように、LD_LIBRARY_PATH動的リンカーで使用され、以下にのみ関連します。走るあなたのサポートのため。この方法は、アプリケーションの実行中に動的ライブラリの場所が見つからない場合に使用できます。 GNUリンカーが使用するのは、LD_RUN_PATH基本的にforが行うことを-rpath行うということです。ただし、指定されたすべての手段は無視されます(低い優先順位を与えるのではなく)。LIBRARY_PATH-rpath-rpathLIBRARY_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

関連情報