在本地目录本地安装库,但程序无法识别


10

我正在以非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中,如configure选项中所指定。我想知道如何让程序识别已安装的库以便运行。我尝试将符号链接放在$ HOME / lib,$ HOME / bin和$ HOME / local / bin中,但是这些都不起作用。任何想法和建议将不胜感激


我假设-R $DIR/libto CFLAGS在构建tmux(而不是libevent)。这对我没有帮助-gcc最终出现了一个错误,说它无法识别-R(同样,我尝试了在-R和之间没有空格$DIR)。./configure --disable-shared这有效,更新了LD_LIBRARY_PATH也有效。我最终libevent再次使用以上--disable-shared选项进行制作。

Answers:


20

尝试使用以下命令重建libevent

./configure --disable-shared

我怀疑这将解决您的问题,因为在构建二进制文件时将链接该库,并且不需要在运行时进行搜索。

或者,如果您需要动态链接的libevent,则可以将包含libevent-2.0.so.5的目录添加到LD_LIBRARY_PATH环境变量中:

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

哇,非常感谢您的快速回复。我最终使用LD_LIBRARY_PATH来解决此问题,因为我可以将此修复程序简单地应用于将来的任何库安装,并始终使用$ HOME / local目录。感谢帮助!
scicalculator 2011年


2

与其他人不走运,但这对我有用,从这里开始

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

2

我问了一个类似的问题,关于tmux所有事物的构建也很有趣(尽管我仍然确定这与GNU configure和GNU make一起使用的任何情况有关。

我相信一种更清洁的方法是利用所谓的“ rpath”-嵌入在二进制文件中的库搜索路径。-rpath至少GNU链接器的开关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 绝对知道应该使用哪些开关。

无论如何,在某些情况下,这-rpath是解决问题的更干净的方法。

LD_LIBRARY_PATH基于解决方案的解决方案使您可以在运行时使用已构建的二进制文件使用的库,这有时是理想的。但是,如果您只是想针对特定的库进行构建,并且已经将其放置在主文件夹中的专用位置中,则我认为-rpath基于解决方案的解决方案将是一个典型的答案。

奇怪的是,为什么tmux在构建期间自己的构建脚本不会从库搜索路径中推断出该路径。我不知道,也许他们不需要也不需要。这是巧合tmux吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.