2

私は自分が実際にコントロールできない環境に座っています (それは私だけではないので、基本的に、環境を変更することはできません。また、他の誰のためにも機能しません)。私が影響を与えることができる唯一のことは、バイナリがビルドされます。

私の問題は、環境が、使用されているコンパイラと互換性のない libstdc++ を含む LD_LIBRARY_PATH を指定していることです。私はそれを静的にコンパイルしようとしましたが、それは g++ では可能ではないようです (バージョン 4.2.3 は、後のバージョンではこの方向で作業が行われたようですが、利用できない -static-libstdc++ など)。

これで、rpath を使用して絶対パス名を実行可能ファイルに焼き付けることができました (動作するはずです。動作するはずのすべてのマシンは同一です)。残念ながら、LD_LIBRARY_PATH が rpath よりも優先されるように見えます (LD_LIBRARY_PATH をリセットすると、ライブラリを見つけることができることが確認されましたが、上記のように、LD_LIBRARY_PATH は全員に設定され、私はそれを変更できません)。

rpath を LD_LIBRARY_PATH よりも優先させる方法はありますか、または私の問題に対する他の解決策はありますか? 実行時の動的リンクについて話していることに注意してください。コンパイルおよびリンク時にコマンドラインを制御できます。

ありがとう。

4

2 に答える 2

3

このプログラムだけの環境を変更するシェル ラッパーを使用できますか?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

これにより、実行前に LD_LIBRARY_PATH がオーバーロードされ、exec を介してラッパーがバイナリに置き換えられます。

これは役に立ちますか?

于 2010-03-09T11:33:31.620 に答える
1

libstdc++.aトリッキーではありますが、リンクすることは間違いなく可能です。手順はこちら

LD_LIBRARY_PATHただし、「焼き付け」よりも優先されるというあなたの主張には少し懐疑的DT_RPATHです-少なくともLinuxと(私が信じている)Solarisでは、ルックアップが失敗しLD_LIBRARY_PATHた後にのみ調べられます。DT_RPATH

于 2010-03-10T07:51:58.550 に答える