2009-09-10 67 views
0

我试图编译一个具有标准构建过程的软件,例如在Linux中与不同的.so文件链接

configure 
make 
make install 

该软件需要库例如libreq.so安装在/ usr/local/lib中。但是,我的问题是我想构建软件并将其与我安装在/ home/user/mylibs中的同一个库的不同版本(我拥有该库的源代码)链接。

我的问题是,我怎么编译并在/ home /用户/ mylibs对链接库的软件,而不是一个在/ usr/local/lib目录

我试图设置“LD_LIBRARY_PATH”包括/家庭/用户/ mylibs但没有奏效。

谢谢!

回答

5

当你有一个autoconf配置脚本,使用:

CPPFLAGS=-I/home/user/include LDFLAGS=-L/home/user/mylibs ./configure ... 

这增加了提名目录的目录列表搜索头文件(通常是必要的,当你使用一个库),并增加了其他提名目录到搜索实际库的列表。

我一直都在使用它 - 在我的工作机器上,/usr/local由MIS'维护',并且包含99.9%的过时代码(并且是NFS挂载的,只读的),所以我努力避免使用它完全可以在/usr/gnu下维护我自己的,更接近当前版本的软件。这个对我有用。

+0

是的,这似乎工作,非常感谢! – 2009-09-10 13:33:57

2

尝试使用LD_PRELOAD设置为您的实际文件。

+0

谢谢,但似乎并没有在构建过程中覆盖/ usr/local/lib版本,是否有一些参数可以通过配置告诉它在特定位置使用库? – 2009-09-10 12:52:53

0

LD_LIBRARY_PATH用于在运行时查找动态链接库。在编译时,您应该将-L参数添加到gcc/g ++中,以指定* .so文件所在的目录。您还需要使用-l <名称>(其中库为libNAME.so)添加库名称。

重要!为了链接你不仅需要libNAME.so文件,而且还需要一个libNAME.a文件。

运行该应用程序时,不要忘记将dir添加到LD_LIBRARY_PATH中。

+0

@重要!为了链接你不仅需要libNAME.so文件,而且还需要一个libNAME.a文件。 - >你不是在谈论Windows(.dll + .lib)吗? .a是静态库,根本不需要。 – nothrow 2009-09-10 12:57:04

+0

你一定是对的!我认为这也是在Linux下需要的。 – Vereb 2009-09-10 13:05:00

0

当您将/home/user/mylibs添加到LD_LIBRARY_PATH中时,是否将其添加到现有路径的前端或结尾?令牌按顺序搜索,因此您希望您的列表中第一个出现。

此外,许多使用configure的标准构建环境将允许您为每个需要的部分指定一个确切的库。您必须运行./configure --help,但您应该看到类似--using-BLAH-lib=/path/to/your/library或类似的内容。