c++ - 链接共享库的依赖项

标签 c++ shared-libraries

我正在使用 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/

相关文章:

c++ - 没有调用 getline(std::istream&, int&) 的匹配函数

c++ - CMake 和 Dylib : symbol definitions

android - 使用 Android Renderscript v8 支持库导致与其他共享库的链接错误

c++ - 将对象从 C++ 存档 (.a) 包含到共享库中

c++ - 将浮点 vector 转换为 16 位 int 而不饱和

c++ - 如果在没有任何用户登录的情况下从任务计划程序启动,应用程序是不可见的

c++ - 安装 CMake 后,我找不到带有 `find_package` 的包

c++ - OnSelChanged 只触发一次

c - Hook 并替换加载的 ELF 中的导出函数(.so 共享库)

c++ - C++ 中具有多个库的单例和工厂