linux - GCC:指定最低共享库版本

标签 linux gcc shared-libraries

背景

我继承并维护了一个与特定硬件紧密耦合的Linux共享库;我们称它为 libfoo.so.0.0.0。这个库已经存在了一段时间并且“刚刚工作”。该库现在已成为多个高层应用程序的依赖项。

现在,不幸的是,新的硬件设计迫使我创建具有更广泛类型的符号,从而导致 libfoo.so.0.1.0。只有补充;没有删除或其他 API 更改。更新后的符号的原始缩小版本仍然以其原始形式存在。

另外,我有一个依赖于 libfoo 的应用程序(例如,myapp)。它最初是为支持库的 0.0.0 版本而编写的,但现在经过重新设计以支持新的 0.1.0 API。

出于向后兼容的原因,我希望能够通过编译标志为旧库或新库构建 myappmyapp 的给定构建将加载到的内核将始终只有一个版本的库,在编译时已知。

问题

以后libfoo很有可能会再次更新。

  1. 构建 myapp 时,是否可以根据构建标志指定要链接的 libfoo最低 版本?

  2. 我知道可以直接在构建 CLI 上指定库名称。这会导致 myapp 要求完全那个版本,或者具有相同主要修订版的 lib 的更高版本仍然能够链接到它(例如 libfoo.所以.0.2.0)?我真的希望不必在每次发布新的次要版本时都更新每个依赖应用的构建。

  3. 是否有更智能的方式以与应用程序无关的方式完成此任务?

引用资料

How do you link to a specific version of a shared library in GCC

最佳答案

您正在描述外部 库版本控制,其中应用是针对 libfoo.so.0libfoo.so.1 等构建的. 文档 here .

使用外部库版本控制要求完全在运行时存在 libfoo.so.x 的相同版本。

这通常不是 Linux 上的正确技术,通过 symbol versioning 的魔力, 允许单个 libfoo.so.Y 提供同一符号的多个不兼容定义,从而允许单个库同时为旧应用程序和新应用程序提供服务。

此外,如果您总是简单地添加新符号,而不是以不兼容的方式修改现有符号,那么没有理由增加外部版本。将 libfoo.so 保持在 0 版本,在其中提供一个 int foo_version_X_Y; 全局变量(以及所有以前的版本:foo_version_1_0 foo_version_1_1 等),并让应用程序二进制文件读取它需要的变量。如果应用程序需要新符号 foo_version_1_2 并使用仅提供 foo_version_1_1 的旧库运行,则应用程序将无法启动并出现明显错误。

关于linux - GCC:指定最低共享库版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792153/

相关文章:

使用查找命令的正则表达式

linux - 两个符号链接(symbolic link)之间的符号链接(symbolic link)

c++ - 输出不同导致蒙特卡洛积分结果不同

c++ - 在 VS 2008 中使用相同设置构建一堆 DLL 文件的最快方法

c++ - Eclipse CDT 自动包含共享库

c++ - 快速确定哪些源代码导致不必要的 .so 链接的脚本

linux - GNU 与 Linux 有何关系?

c - 如何检查 C 中的网络设备状态?

c++ - GCC 4.2 模板奇怪的错误

c - -lm 不工作,除非它在命令的末尾