生成的二进制文件链接,而不是使用本地图书馆系统

问题描述:

我的构建系统已安装在这条道路的libtiff:生成的二进制文件链接,而不是使用本地图书馆系统

/usr/lib/x86_64-linux-gnu/libtiff.so.5.2.4 

而且我在本地路径,构建了一个定制的libtiff:

/home/user/libtiff/usr/local/lib/libtiff.so.3.8.2 

我想建立一个与我的本地路径上安装的libtiff链接的二进制文件。要做到这一点,我使用这个命令:

cc -o binary \ 
    obj1.o ... objn.o \ 
    -L /home/user/libtiff/usr/local/lib/ \ 
    -Wl,-rpath,L/home/user/libtiff/usr/local/lib/ \ 
    -ltiff 

问题是链接和生成二进制后,LDD列出了二进制不使用本地的libtiff,但在构建系统上安装了库:

$ ldd binary | grep libtiff 
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fbaf9ad6000) 

我不明白为什么链接器不使用本地库。

我读过一些关于设置LD_LIBRARY_PATH,LD_PRELOAD或LIBRARY_PATH的相关文章,但没有一篇按预期工作。

修改/etc/ld.so.conf不是一个不错的选择。

根斜线前面取出假L

-Wl,-rpath,L/home/user/libtiff/usr/local/lib/ 
+0

删除根斜杠前面的虚假L会得到完全相同的问题。命令ldd显示libtiff与安装在构建系统(libtiff.so.5)上的库链接,而不是与本地库(libtiff.so.3)链接。该二进制文件与多个本地库链接(例如,它也使用mbedtls)。 mbedtls库也安装在构建系统上,但对于此库,ldd显示它正在使用本地库。没有删除虚假L我得到完全相同的问题。 – aicastell

+1

@aicastell嗯,我无法在本地重现此问题,因此无法提供更多信息。也许你可以用'-Wl,-verbose'和'LD_DEBUG = libs'运行? – yugr

@yugr,感谢您对本-verbose提示。它帮助我解决了这个问题。问题在于本地编译的另一个库(spandsp)依赖于libtiff。 spandsp的配置脚本决定使用libtiff.so.5(构建系统)而不是libtiff.so.3(本地编译)。这是因为LDFLAGS在执行配置脚本之前没有正确定义。将LDFLAGS定义为-L/home/user/usr/local/lib/-Wl,-rpath-link,/ home/user/usr/local/lib /修复了问题。非常感谢您对帮助解决这个问题的兴趣! :)

+1

Np,很高兴提供帮助。 – yugr