この問題は、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_PATH
CPLUS_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
-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