c++ - 将私有(private)库静态链接到公共(public)库以隐藏符号

标签 c++ static symbols collision

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




考虑以下:

  • 我正在用 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 已经建立,可能我不想修改它的源代码或build设置(如果公开可用)。

    为了把更多的东西放在地球上,我正在设计一个肯定需要一些第三方库的 SDK,比如 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 的答案似乎是一个可行的解决方案,但我不确定它是否有效,或者是否可以在 *nix 以外的操作系统上复制。

    最佳答案

    我在静态库中多次遇到过这个问题,最近一次是使用 MSVCRT。正如一位评论者指出的那样,对于单个可执行文件,单一定义规则会成为障碍。除了修补二进制文件之外,我真的没有办法解决这个问题,我能想到。并且您必须“深入”地执行此操作 - 捕获静态库 Y (zlib) 对其自己的外部链接对象所做的所有内部引用。

    在这种情况下,我建议使用动态库(DLL 或 SO)。它会增加一些部署的复杂性。但它提供了一个可执行的“防火墙”,允许具有相同名称的全局对象驻留在每个二进制文件中而不会发生冲突。即便如此,如果应用程序和 DLL 都具有冲突的第三方依赖项,则可能会出现问题。不过,可能是最好的选择。

    关于c++ - 将私有(private)库静态链接到公共(public)库以隐藏符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862975/

    相关文章:

    c++ - 在文件中搜索字符串

    c# - 锁定静态字段

    c# - 整个程序集的静态构造函数

    c - 未找到信号量符号 (c)

    C++11 对象指针列表的初始化

    c++ - 存储成员 get/set 函数供以后使用

    c++ - ld : duplicate symbols for architecture x86_64 when defining a global var in a header

    linux - 为什么 ELF 文件包含大小为 0 的符号表部分?

    c++ - 如何在 Windows Phone 8.1 中通过蓝牙连接发送字符

    java - 从静态方法实例化子类