我正在以非 root 用户身份在服务器上安装程序。具体来说,它是 tmux 1.5,但我认为这应该广泛适用于所有本地安装的程序(我提到程序名称,以防这个问题最终不是我自己的错误)。
该程序要求我安装一些依赖库(例如 libevent 和 ncurses)。因此,由于我没有 root 权限,所以我在本地安装了它们
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 中放置符号链接,但这些都不起作用。任何想法和建议都将不胜感激
答案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
我问过了类似的问题,有趣的是,这也与tmux
万物的构建有关,尽管我仍然确信这不应该适用于 GNUconfigure
和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