【问题标题】:Generated binary is linked to use system instead of local library生成的二进制文件链接到使用系统而不是本地库
【发布时间】:2017-03-10 15:04:04
【问题描述】:

我的构建系统在此路径中安装了 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 不是一个好的选择。

【问题讨论】:

    标签: gcc shared-libraries ld libtiff


    【解决方案1】:

    删除根斜线前的虚假L

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

    【讨论】:

    • 删除根斜杠前面的虚假 L 会遇到完全相同的问题。命令 ldd 显示 libtiff 链接到安装在构建系统上的库 (libtiff.so.5),而不是本地库 (libtiff.so.3)。此二进制文件与多个本地库链接(例如,它也使用 mbedtls)。 mbedtls 库也安装在构建系统上,但是对于这个库,ldd 显示它正在使用本地库。在不删除虚假 L 的情况下,我遇到了完全相同的问题。
    • @aicastell 嗯,我无法在本地重现该问题,因此如果没有其他信息就无法提供帮助。或许您可以与-Wl,-verbose 链接并使用LD_DEBUG=libs 运行?
    【解决方案2】:

    @yugr,感谢您提供这个详细的提示。它帮助我解决了这个问题。问题出在另一个本地编译的库(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/ 解决了这个问题。非常感谢您有兴趣帮助解决这个问题! :)

    【讨论】:

    • Np,很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多