非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にシンボリックリンクを配置しようとしましたが、どれも機能しませんでした。どんなアイデアや提案も大歓迎です
使用してlibeventを再構築してみてください
./configure --disable-shared
ライブラリはバイナリのビルド時にリンクされ、実行時に検索する必要がないため、これで問題が解決すると思います。
または、動的にリンクされたlibeventが必要な場合は、libevent-2.0.so.5を含むディレクトリをLD_LIBRARY_PATH環境変数に追加できます。
export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
RPATHを設定することもできます バイナリ自体にライブラリ検索パッチをエンコードします 。
CFLAGS
に-R $DIR/lib
を追加するだけです。
私は 同様の質問 に質問しました、すべてのもののtmux
の構築についても興味深いことに十分です(ただし、これがGNU configure
とmake
が一緒に使用されるあらゆる状況に関係していることは確かです。
より明確なアプローチは、いわゆる「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
によって使用される)用の独自の構成ファイルがインストールされます。 libevent
definitelyのみが、それに対して構築するときに使用するスイッチを知っているため、これを使用する必要があります。
とにかく、いくつかの状況では、-rpath
は問題を解決するためのよりクリーンなアプローチです。
ただし、LD_LIBRARY_PATH
ベースのソリューションを使用すると、ビルド時にビルドされたバイナリが使用するライブラリを実行時に調整できます。しかし、ホームフォルダの専用の場所に置いた特定のライブラリに対してビルドしたいだけの場合、-rpath
ベースのソリューションは、標準的な答えと見なすと思います。
奇妙なことに、tmux
'独自のビルドスクリプトは、ビルド中にライブラリ検索パスからこのパスを推測しません。多分彼らは必要とすべきではないし、すべきではないのか、私にはわかりません。 tmux
をビルドする私たちにこれが起こったのは偶然ですか?
他の人には運がないが、これは here から私にとってはうまくいった:
Sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5