4

そう。マシンに 2 つのバージョンの GCC があると問題が発生します。
3.4.6 および 4.1

これは、新しいソフトウェアのいくつかの依存関係の問題が原因です。(glibc 4.1 が必要)

この新しいソフトウェアを 4.1 ライブラリにリンクしようとすると、問題なくリンクします。ただし、ソフトウェアの実行に関しては、LD_LIBRARY_PATH で 3.4.6 を見ているため、ライブラリが見つかりません。LD_LIBRARY_PATH を 4.1 ライブラリに設定すると、3.4.6 ライブラリがそのために使用されるため、他のものを殺すとともに、シェルを爆破します。

その少しキャッチ 22。

リンク時に、LD_LIBRARY_PATH を使用せずにその共有ライブラリへの絶対パスを与える方法はありますか?

このようにして、うまくいけば両方のバージョンを使用できますが、この特定のアプリケーションには 4.1 しか使用できませんか?

4

3 に答える 3

7

プログラムの起動時に使用され、ライブラリを探すときに優先される絶対パスを意味しますか? rpathまさにそれです。デフォルトの検索パスと LD_LIBRARY_PATH に設定されているものを上書きします。リンカーに渡すように gcc に指示するだけです。

g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp

検索処理を表示することができます (helpより多くのオプションを提供するために使用します):

[js@HOST2 cpp]$ LD_DEBUG=libs ./a.out
  5859:     find library=libc.so.6 [0]; searching
  5859:      search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686:
               /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls:
               /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686:
               /usr/lib/my_4.1/sse2:/usr/lib/my_4.1  (RPATH from file ./a.out)
  5859:       trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6
  5859:       ....
  5859:      search cache=/etc/ld.so.cache
  5859:       trying file=/lib/libc.so.6  (note: found here!)
  5859:
于 2009-01-15T20:23:13.813 に答える
1

実際にはあなたの質問に対する答えではありませんが、別の解決策:

新しいlibパスをrootに追加し/etc/ld.so.confて実行することで、問題を修正できるはずです。ldconfig

于 2009-01-15T20:55:53.497 に答える
0

必要なアプリケーションだけに LD_LIBRARY_PATH を設定できませんか? つまり、エクスポートされた変数としてグローバルに設定する代わりに、プログラムを次のように実行します

LD_LIBRARY_PATH=/path/to/4.1/libs my_executabel

?

-k

于 2010-10-16T15:59:10.397 に答える