【问题标题】:Linking dependencies of a shared library链接共享库的依赖项
【发布时间】:2011-09-22 00:08:18
【问题描述】:

我正在使用 SFML,我编译了一个小测试程序并添加了链接选项-lsfml-audio。然后,我使用ldd ./program 查看它链接到的动态库。令人惊讶的是,有很多,我没有在我的 makefile 中手动选择它们,也没有使用pkg-config --libs

我开始阅读有关共享库的内容,并做了一个小例子来解决我的疑问。但是,我有一个问题:

为什么有些库需要你在 makefile 中添加依赖项 (手动或使用 pkg-config 之类的脚本)和其他 库会自动链接它们的依赖项吗?

当您创建动态库时,就像在g++ -shared ... 命令中添加正确的-ldependency 选项一样简单,以避免用户稍后手动添加依赖项的麻烦。为什么许多可用的库不这样做?

我想这一定与微调链接哪些库的能力有关。

【问题讨论】:

    标签: c++ shared-libraries


    【解决方案1】:

    共享库通常会链接到它们的依赖项。但是,静态库不能这样做。 pkg-config --libs 通常包含所有依赖项(直接和间接),因此您只需添加 -static 即可切换到静态编译,而无需添加其他库依赖项。

    请注意,在某些情况下,这些过多的直接依赖项被认为是不需要的(例如,debian 试图在打包的二进制文件中避免它们,因为它们使库 soname 转换比必要的更具创伤性)。您可以使用 -Wl,--as-needed 标志指示链接器从最终可执行文件中去除不需要的直接依赖项。

    【讨论】:

    • 我想我需要在这里做一些命名:共享库通常不会引入它们的依赖项(当它看到 *.la 文件时,它是 libtool)。它们不需要包含它,因为动态加载器会从共享库中的 .NEEDED 标头中找出它们。除了libtool 引入的过度链接问题之外,必须在链接时查找符号定义也会大大减慢构建速度。
    • @honk,是的,libtool 是这些问题的根源之一。不过,pkg-config 脚本也可以做到这一点。在任何情况下,它们在 ELF 平台上绝对不是必需的——你只需要直接链接你使用的东西(尽管这包括通过内联函数或宏使用的任何东西)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2016-06-06
    • 2018-11-02
    • 2019-11-24
    • 1970-01-01
    • 2012-04-05
    • 2013-05-11
    相关资源
    最近更新 更多