考虑以下:
- 我正在用 C++ 开发一个静态库 X,它在内部使用著名的静态库 Y v2.0;
- 我只想分发一个库 X',即 X 与 Y 静态链接/合并以供其内部使用;
- 开发人员想在他的可执行文件中使用 X';
- 此外,他需要 Y v1.0(不像我那样需要 v2.0);
- Y v1.0 和 v2.0 有一些共同的符号,而这些共同的符号中的一些也表现不同。
我开发 X 时严格要求将 Y v2.0 用于某些内部业务。这就是说我无论如何都不能恢复到 Y v1.0。
另一方面,开发者对使用 Y v1.0 也有类似的限制。
正如您已经争论的那样,问题是:如何在不导出 Y 符号以避免冲突的情况下将 Y 链接到 X 中?Y 很成熟,可能我不想修改它的源代码或构建设置(如果公开可用)。
为了把更多的东西放到地球上,我正在设计一个 SDK,它肯定需要一些 3rd 方库,比如说 zlib。在我的开发中,我将依赖 zlib v1.2.3.4.5.rc6,因为我广泛且成功地使用和测试了它,如果我更改版本,我负担不起所需的 SDK 测试/修复。
SDK 将提供的所有静态或动态链接库都必须隐藏第 3 方静态库。
潜在客户可能会遇到类似的限制(他需要 zlib v7.8.9),那么如何避免符号冲突?同样,可能不更改原始源代码(命名空间等)。
更复杂的是,SDK 是多平台的,这意味着我需要不同的方法来解决问题,具体取决于平台(Windows、Linux、Mac OS、iOS、Android 等)和使用的编译器(例如 MSVC++ 和 g++) .
谢谢你。
更新
似乎我是这个问题的 VENDOR2:
Linking with multiple versions of a library
bstpierre's answer 似乎是一个可行的解决方案,但我不确定它是否有效,或者它是否可以在 *nix 以外的操作系统上复制。