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

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

非ルート ユーザーとしてサーバーにプログラムをインストールしています。具体的には 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: 共有オブジェクトファイルを開けません: そのようなファイルまたはディレクトリはありません

プログラムが目的のライブラリを見つけられないように思われますが、configure オプションで指定されているように、libevent-2.0.so.5 ファイルは確かに $HOME/local/lib に存在します。プログラムがインストール済みのライブラリを認識して実行できるようにするにはどうしたらよいか考えています。$HOME/lib、$HOME/bin、$HOME/local/bin にシンボリック リンクを配置してみましたが、どれもうまくいきませんでした。アイデアや提案があれば、ぜひ教えてください。

答え1

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

./configure --disable-shared

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

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

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

答え2

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

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

答え3

私は尋ねました同様の質問、興味深いことに、何よりもビルドに関するものですが、GNUと が一緒に使用されるtmuxほぼすべての状況にこれが当てはまるはずはないことは確かです。configuremake

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

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

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./configurelibeventpkg-config./configurelibevent 絶対にそれに対して構築するときにどのスイッチを使用する必要があるかを知っています。

いずれにせよ、状況によっては、-rpath問題を解決するためのよりクリーンなアプローチになります。

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

不思議なのは、tmuxビルド中に独自のビルド スクリプトがライブラリ検索パスからこのパスを推測しない理由です。おそらく、推測する必要がないし、推測すべきではないのでしょうが、私にはわかりません。ビルドしている私たちにこれが起こったのは偶然でしょうかtmux?

答え4

他の方法ではうまくいかなかったが、これは私にとってはうまくいった。ここ:

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

関連情報