非ルート ユーザーとしてサーバーにプログラムをインストールしています。具体的には 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
ほぼすべての状況にこれが当てはまるはずはないことは確かです。configure
make
よりクリーンなアプローチは、いわゆる「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
./configure
libevent
pkg-config
./configure
libevent
絶対にそれに対して構築するときにどのスイッチを使用する必要があるかを知っています。
いずれにせよ、状況によっては、-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