链接共享库

链接共享库

问题描述:

我与SFML工作的依存关系,我整理了一个小的测试程序,并添加了链接选项-lsfml-audio。然后,我使用ldd ./program来查看它链接到的动态库。令人惊讶的是,有很多,我没有手动选择我的生成文件,也没有使用pkg-config --libs链接共享库

我开始阅读关于共享库,并提出了一个小例子来解决我的疑惑。不过,我有这样一个问题:

为什么一些图书馆需要您添加的依赖在你的makefile (手动或使用像pkg-config脚本)和其他 库自动链接它们的依赖?

当您建立动态库,只是作为g++ -shared ...命令添加适当的-ldependency选项,以避免用户手动添加的依赖以后的麻烦一样容易。为什么很多可用的库不这样做?

我猜它必须与微调的哪些库获取链接和这样的能力。

共享库通常会链接在他们的依赖。但是,静态库不能这样做。 pkg-config --libs通常包含所有依赖关系(直接和间接),以便您可以通过简单添加-static来切换到静态编译,而无需添加其他库依赖关系。

注意的是,这些过剩的直接依赖被认为在某些情况下不需要的(例如,Debian的尝试,以避免他们在包装的二进制文件,因为他们使库的soname转变超过必要的创伤)。您可以指示链接器从最终可执行文件中去除-Wl,--as-needed标志不需要的直接依赖项。

+0

我想我需要做一些骂人的位置:共享库通常不会在它们的依赖拉(这是'libtool'当它看到一个'* .la'文件)。它们不需要包含它,因为动态加载器会从共享库中的'.NEEDED'头中找出它们。除了libtool介绍的链接问题之外,不得不在链接时查找符号定义也会减慢构建的速度。 –

+0

@ honk,是的,libtool是这些问题的一个来源。不过,pkg-config脚本也可以。无论如何,它们在ELF平台上绝对不是必需的 - 您只需直接链接您使用的内容(尽管这包括通过内联函数或宏使用的任何内容) – bdonlan