我正在使用 SFML,我编译了一个小测试程序并添加了链接选项 -lsfml-audio
。然后,我使用 ldd ./program
查看它链接到的动态库。令人惊讶的是,有很多,我没有在我的 makefile 中手动选择,也没有使用 pkg-config --libs
。
我开始阅读有关共享库的内容,并举了一个小例子来解决我的疑惑。但是,我有这个问题:
why some libraries need you to add the dependencies in your makefile (either manually or using a script like
pkg-config
) and other libraries automatically link their dependencies?
当您创建动态库时,就像在 g++ -shared ...
命令中添加适当的 -ldependency
选项一样简单,以避免用户稍后手动添加依赖项的麻烦。为什么许多可用的库不这样做?
我想这一定与微调链接哪些库等的能力有关。
最佳答案
共享库通常会链接到它们的依赖项中。但是,静态库不能这样做。 pkg-config --libs
通常包含所有依赖项(直接和间接),因此您只需添加 -static
即可切换到静态编译,而无需添加额外的库依赖项,因为好吧。
请注意,这些过多的直接依赖在某些情况下被认为是不需要的(例如,debian 试图在打包的二进制文件中避免它们,因为它们会使库 soname 转换比必要的更痛苦)。您可以使用 -Wl,--as-needed
标志指示链接器从最终可执行文件中去除不需要的直接依赖项。
关于c++ - 链接共享库的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508131/