我正在使用SFML,我编译了一个小测试程序并添加了链接选项-lsfml-audio
。然后,我使用ldd ./program
来查看它链接到的动态库。令人惊讶的是,有很多,我没有在makefile中手动选择,也没有使用pkg-config --libs
。
我开始阅读有关共享库的内容,并举一个例子来解决我的疑惑。但是,我有这个问题:
为什么有些库需要您在makefile中添加依赖项 (手动或使用像
pkg-config
这样的脚本)和其他 库自动链接它们的依赖项?
当您创建动态库时,就像在-ldependency
命令中添加正确的g++ -shared ...
选项一样简单,以避免用户稍后手动添加依赖项的麻烦。为什么许多可用的库不这样做?
我想它必须与微调哪些库链接等的能力有关。
答案 0 :(得分:6)
共享库通常会链接其依赖项。但是,静态库无法执行此操作。 pkg-config --libs
通常包含所有依赖项(直接和间接),因此您只需添加-static
即可切换到静态编译,而无需添加其他库依赖项。
请注意,在某些情况下,这些过多的直接依赖关系被认为是不受欢迎的(例如,debian试图在打包的二进制文件中避免它们,因为它们使库soname转换比必要的更具创伤性)。您可以指示链接器从-Wl,--as-needed
标志所需的最终可执行文件中删除直接依赖项。