2013-07-29 6 views
6

私はldconfigLD_LIBRARY_PATHを使用することの一般的な基礎を知っていますが、私の状況を少し助けてくれることを願っています。ソフトウェアパッケージのLD_LIBRARY_PATHまたはldconfigの適切な使用

私は、独自のディレクトリにあり、多くのライブラリの独自のバージョンを持っているポータブルソフトウェアパッケージを持っています。

このディレクトリから実行される多数のバイナリとスクリプトがあります。

バイナリ(apache、php、postgres)の中には、別々のバージョンがシステムにインストールされているものもあります。

phpのバージョンが2つある可能性があるので、ldconfigファイルを使用する "myapp"のバージョンをシステムが判別できない場合は、/etc/ld.so.conf.d/myapp.confを作成するだけでは不十分です。

私はこのようなシステムの設定に関するベストプラクティスを探しています。最初にソフトウェアパックをセットアップした人は、LD_LIBRARY_PATHをエクスポートして、システム上のすべてのアプリケーションがそれを使用するようにしました。

私はパッケージディレクトリ内のアプリケーションだけを分離しようとしています。

で動作するようにいくつかのパラメータ:

/mypackは - ソフトウェアパッケージ

/mypack/local/libのためにすべてを含んでいる - システム

ライブラリの例と互換性がない可能性があり、必要なライブラリが含まれています

/mypack/local/lib/libz.so.1 => /mypack/local/lib/libz.so.1.2.3 
/lib/libz.so.1 => /lib/libz.so.1.2.3 

バージョンが同じでも、/ mypackにあるものはディストリビューションと互換性があるとそれが

バイナリ例

使われている場合は、システムを中断しますない: PHPは PHPのlibsを使用する必要があります/ MYPACKの両方から/ MYPACKで、デフォルトのディレクトリに存在する/ MYPACK/local/libのとから、ディストリビューションのバージョンは/ libを使用する必要があります

Linuxライブラリのパスに関するご質問 - /etc/ld.so.conf.d/php.confを/ mypackのphpのバージョンにのみ影響するように指定できますか? - 実行ファイルの場所に基づいてライブラリパスを指定できますか?つまり、実行時に、実行可能ファイルのパスが/ mypackの下にある場合、自動的にそこからライブラリを使用できますか? - ユーザー単位ではどうですか?システムの一部またはほとんどは、異なるユーザーアカウントで動作します。ユーザーごとに異なるライブラリパスを設定することができれば、それが解決されます。

+0

にそれらを付加ラッパースクリプトを使用する。ラッパースクリプトはLD_LIBRARY_PATHの値を設定し、実行可能ファイルを実行します。例えばgoogle-chromeを見てみましょう。 –

+0

これが誰かが出てくる唯一の方法だとすれば、私はそれに行くでしょう。私は既にCentOSでChrome 28を実行していましたが、実行ファイルの数が異なるため、私はそれを避けようとしていました。 – thatthatisis

答えて

5

誰が、これは重宝場合、私は建物の前にこれをやってしまった:

export LD_RUN_PATH='$ORIGIN/../lib' 

これは、バイナリの場所への相対的なバイナリ自体にライブラリパスを、含まれています。これをbashスクリプトやビルド・ファイルで使用する予定の場合は、$ ORIGIN、¥$$ ORIGINまたは$$のような処理が必要な場合があるので、$ ORIGINを使用して特定の使用法を調べてくださいビルドに関わるさまざまなユーティリティがドル記号を正しくエスケープするようにORIGINを設定します。この便利なビットを見つけることは私たちのソフトウェアパックを構築するためのバッチとして実行する約50個の個別のスクリプトを更新する必要がなくなりました。

0

通常、LD_LIBRARY_PATHはldconfigが提供する情報の前にあるという問題があります。あなたがしたいすべてが既にそれらを持っていないシステム上のインストールのバックアップライブラリのセットを持っている場合は、私は典型的なアプローチだと思うのldconfigからのライブラリの現在のセットを抽出し、LD_LIBRARY_PATH

mytmp=/tmp/${USER}_junk$$ 
(for i in `/sbin/ldconfig -p | grep '=>' | awk '{ print $NF }'` ; do dirname $i ; done) | sort -r | uniq > ${mytmp} 
myld="" 
for j in `cat ${mytmp}` ; do myld=${j}:${myld} ; done 
rm -f ${mytmp} 
LD_LIBRARY_PATH=${myld}${LD_LIBRARY_PATH}:${SEP}/lib:${SEP}/lib/syslibs 
export LD_LIBRARY_PATH