web-dev-qa-db-ja.com

ライブラリをローカルのホームディレクトリにインストールするが、プログラムがライブラリを認識しない

非rootユーザーとしてサーバーにプログラムをインストールしています。具体的にはtmux 1.5ですが、これはローカルにインストールされたすべてのプログラムに広く当てはまると思います(この問題が私自身のエラーではない場合に備えて、プログラム名について言及しています)。

このプログラムでは、いくつかの依存ライブラリ(libeventやncursesなど)をインストールする必要があります。ルートアクセスがないため、両方をローカルにインストールしました

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

プログラムをインストールするには、ライブラリパッケージも含める必要がありました。

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

これで、問題なくプログラムが$ HOME/local/binにインストールされますが、実行可能ファイル$ HOME/local/bin/tmuxを実行すると、次のエラーが発生します。

tmux:共有ライブラリの読み込み中にエラーが発生しました:libevent-2.0.so.5:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

プログラムが目的のライブラリを見つけられないように見えますが、libevent-2.0.so.5ファイルは、実際には構成オプションで指定されている$ HOME/local/libに存在します。実行するために、プログラムにインストールされたライブラリを認識させる方法を知りたいのですが。 $ HOME/lib、$ HOME/bin、および$ HOME/local/binにシンボリックリンクを配置しようとしましたが、どれも機能しませんでした。どんなアイデアや提案も大歓迎です

10
scicalculator

使用してlibeventを再構築してみてください

./configure --disable-shared

ライブラリはバイナリのビルド時にリンクされ、実行時に検索する必要がないため、これで問題が解決すると思います。

または、動的にリンクされたlibeventが必要な場合は、libevent-2.0.so.5を含むディレクトリをLD_LIBRARY_PATH環境変数に追加できます。

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
20
drootang

RPATHを設定することもできます バイナリ自体にライブラリ検索パッチをエンコードします

CFLAGS-R $DIR/libを追加するだけです。

7
Patches

私は 同様の質問 に質問しました、すべてのもののtmuxの構築についても興味深いことに十分です(ただし、これがGNU configuremakeが一緒に使用されるあらゆる状況に関係していることは確かです。

より明確なアプローチは、いわゆる「rpath」、つまりバイナリに埋め込まれたライブラリ検索パスを利用することだと思います。少なくともGNUリンカーの-rpathスイッチは、ldでパスを指定します。

ビルドコマンドラインは次のようになります。

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

ここでは特に重要ではありませんが、上記のPKG_CONFIG_PATHは、他の方法で手動で-L/path/to/libevent/lib -I/path/to/libevent/include./configureスクリプトに送信することを実現するための推奨方法です。 libeventをビルドすると、pkg-config./configureによって使用される)用の独自の構成ファイルがインストールされます。 libeventdefinitelyのみが、それに対して構築するときに使用するスイッチを知っているため、これを使用する必要があります。

とにかく、いくつかの状況では、-rpathは問題を解決するためのよりクリーンなアプローチです。

ただし、LD_LIBRARY_PATHベースのソリューションを使用すると、ビルド時にビルドされたバイナリが使用するライブラリを実行時に調整できます。しかし、ホームフォルダの専用の場所に置いた特定のライブラリに対してビルドしたいだけの場合、-rpathベースのソリューションは、標準的な答えと見なすと思います。

奇妙なことに、tmux '独自のビルドスクリプトは、ビルド中にライブラリ検索パスからこのパスを推測しません。多分彼らは必要とすべきではないし、すべきではないのか、私にはわかりません。 tmuxをビルドする私たちにこれが起こったのは偶然ですか?

2
amn

他の人には運がないが、これは here から私にとってはうまくいった:

Sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
2
beardc