/usr/binにあるプログラムが常に/usr/libにあるライブラリを使用するようにする方法

/usr/binにあるプログラムが常に/usr/libにあるライブラリを使用するようにする方法

Fedora 26のパスの問題で苦労しています。私は更新されたプログラムとライブラリを構築し、それをプログラムが使用します/usr/local。現在、未知の理由から、Fedora 26はLinuxライブラリを使用しています。/usr/local/bin/usr/local/libgawk/usr/bin/gawk/usr/local/lib

ライブラリが/usr/local/lib期待したものと互換性がないため、gawkスクリプトが破損します。あるいは、より正確には、私のスクリプトがAutotoolsを呼び出してからパスがめちゃくちゃでなくても、Autotoolsは中断されます。背景の問題の詳細については、次をご覧ください。libreadline.so.7: 未定義シンボル: UPスタックオーバーフローに。

/usr/bin私はその中のすべてのプログラムが必ずつながるべきであるというポリシーを実施したいと思います/usr/lib。私はミックスインやインサートを気にしません。これを行う必要がある場合は、ソースからパッケージをビルドしてください/usr/local

たとえば、他のオペレーティングシステムでは、以前はOS XとWindowsのマニフェストでinstall_namesこの問題を解決しました。 Linuxでは、同じ問題が悪化することを許可します(--enable-new-dtags私の考えでは、これが問題を解決できない最新の倉庫だと思います)。

/usr/binプログラムをライブラリに強制的にリンクするにはどうすればよいですか/usr/lib

答え1

動的部分を指定して、実行可能ファイルの検索パスをオーバーライドできます DT_RUNPATH。バラよりld.so のマニュアルページ。標準の場所を使用することは標準でなければならず、/usr/libライブラリを使用したいプログラム(あまりにも多くないことを願っています)は、リンカに次のgccオプションを追加してリンクする必要があります。/usr/local/lib

gcc ... -Wl,-rpath,/usr/local/lib -Wl,--enable-new-tags ...

答え2

export LD_LIBRARY_PATH=/usr/lib

または、次のコマンドを直接実行してください。

LD_LIBRARY_PATH=/usr/lib gawk

デフォルトの検索順序は次のように設定できます。/etc/ld.so.conf

答え3

システムにすでに存在するライブラリを手動でコンパイルする場合は、/usr/lib場所に関係なく最新のインストールが優先されます。ライブラリパスは/etc/ld.so.confで指定されており、必要なライブラリへのパスを含む新しいファイルを作成して後で実行できます。/usr/lib64/usr/local/lib/usr/local/lib64/etc/ld.so.conf.dldconfig

あるいは、スクリプト内のLD_LIBRARY_PATH環境変数を使用して独自のライブラリパスを設定することもできます。これにより、スクリプトは指定されたライブラリパスを使用します。複数のパスをセミコロンで区切って提供できます。

関連情報