C++ 将私有库静态链接到公共库以隐藏符号

C++ 将私有库静态链接到公共库以隐藏符号,c++,static,symbols,collision,C++,Static,Symbols,Collision,考虑以下几点: 我在C++中开发了一个静态库X,在内部使用著名的静态库yv2.0;br/> 我只想分发一个库X',即X与Y静态链接/合并以供内部使用 开发人员希望在其可执行文件中使用X′ 此外,他需要Y v1.0(而不是像我一样的v2.0) Y v1.0和v2.0有一些共同的符号,这些共同符号中的一些行为也不同。 我开发X时严格要求将Y v2.0用于某些it内部业务。也就是说,我无论如何都不能回到Y v1.0。 另一方面,开发人员对使用yv1.0有类似的限制 正如您已经提出的,问题是:如何在

考虑以下几点:

  • 我在C++中开发了一个静态库X,在内部使用著名的静态库yv2.0;br/>
  • 我只想分发一个库X',即X与Y静态链接/合并以供内部使用
  • 开发人员希望在其可执行文件中使用X′
  • 此外,他需要Y v1.0(而不是像我一样的v2.0)
  • Y v1.0和v2.0有一些共同的符号,这些共同符号中的一些行为也不同。
我开发X时严格要求将Y v2.0用于某些it内部业务。也就是说,我无论如何都不能回到Y v1.0。
另一方面,开发人员对使用yv1.0有类似的限制

正如您已经提出的,问题是:如何在不导出Y符号的情况下在X内链接Y以避免碰撞? Y已经很成熟了,可能我不想修改它的源代码或构建设置(如果公开的话)

为了把更多的东西放到地球上,我正在设计一个SDK,它肯定需要一些第三方库,比如zlib。 在我的开发过程中,我将依赖zlib v1.2.3.4.5.rc6,因为我广泛且成功地使用和测试了它,如果我更改版本,我无法承担所需的SDK测试/修复费用。
SDK将提供的所有静态或动态链接库必须隐藏第三方静态库。

潜在客户可能会受到类似的限制(他需要zlib v7.8.9),因此如何避免符号冲突?同样,可能不更改原始源代码(名称空间等)

更复杂的是,SDK是多平台的,这意味着我需要根据平台(Windows、Linux、Mac OS、iOS、Android等)和使用的编译器(如MSVC++和g++)的不同来解决问题。

多谢各位

更新
我似乎是这个问题的买主:

BST Pierre的答案似乎是一个可行的解决方案,但我不确定它是否有效,也不确定它是否可以在*nix以外的操作系统上复制。

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


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

(匿名)名称空间,也许?这是我想要避免的,即修改第三方libs的源代码(假设我有权访问)。windows、linux、os x、ios、android。。。该代码几乎完全独立于平台,如果出现依赖于平台的情况,它将在所有受支持的操作系统上实现。请为库X的公共函数尝试“attribute”((可见性(“默认”))”,并在使用g++编译时使用“g++-fvisibility=hidden test.cpp-o test”。如果您的名称与外部链接冲突,并且考虑到您的限制(不要以任何方式修改代码,不要做与平台相关的事情),那么这只是违反了一条定义规则。