使用来自不同时间/团队编译的同一VS的C ++ DLL - ABI兼容性?

时间:2016-10-21 14:10:25

标签: visual-c++ visual-studio-2015 abi visual-c++-2015

重复:我正在寻找相同的 Visual-C ++版本的库之间的ABI兼容性!

我们希望混合和匹配来自不同团队的一些内部C ++ DLL - 使用不同的项目文件在不同时间构建。由于构建时间较长,我们确实希望避免大型单片构建,其中每个团队重新编译另一个团队库的源代码。

当使用C ++接口消耗C ++ DLL 时,rather clear that只有在使用相同的编译器/ Visual编译所有DLL时才能执行此操作Studio版本。

对我来说,显而易见的是 ,确实需要与ABI兼容。

  • 显然 debug(_DEBUG)和release(NDEBUG)不能混用 - 但是这些链接到不同版本的共享运行时的事实也很明显
  • 您是否需要完全相同的编译器版本,或者生成的DLL链接到相同的共享 C ++运行时是否足够 - 也就是说,基本上相同redistributable? (我认为当传递完整的C ++对象时静态不会飞)
  • 是否有一个compiler(和链接器)选项的文档列表需要相同才能使相同vc ++版本的两个C ++ DLL兼容?
    • 例如,是否需要相同的/O切换 - 优化级别是否会影响ABI兼容性? (我很确定不会。)
    • 或者两个版本都必须使用相同的/EH switch
    • /volatile:ms|iso ......?

基本上,我想提出一组(元)数据来与描述它的ABI兼容性的Visual-C ++ DLL相关联。

如果存在差异,我现在只关注VS2015。

1 个答案:

答案 0 :(得分:1)

在过去几天一直在思考这个问题,我所做的就是试着看看是否存在一些用例,开发人员已经需要对其C ++版本进行分类以确保二进制文件兼容。

其中一个地方是Native Packages from nuget。所以我在那里查看了一个包,特别是cpprestsdk

downloadable package中的二进制文件如下所示:

native\v120\windesktop\msvcstl\dyn\rt-dyn\x64\Release\
        ^      ^         ^      ^    ^     
  VS version   |       not sure |    uses cpp-runtime dynamically
               |               lib itself dynamic (as opposed to static)
    or WinXP or WinApp(WinRT?)

我从这个例子中删除了这个,因为我找不到任何其他文档。我也知道boost binaries build目录以类似的方式分开。

因此,要获取元数据列表以确定ABI兼容性,我可以初步列出以下内容:

  • VC版本(即使用的C和CPP运行时库的版本)
    • 这里的一点是,例如vc140现在应该足够了 - 考虑到CRT的链接方式,版本化CRT组件的所有可能的错误修正都必须是ABI兼容的,因此建立给定预编译库的版本并不重要。
  • 纯天然|托管(/ CLI)| WinRT的
  • 如何使用CRT(静态/动态)
  • bitness / platform(Win32,x64,ARM等)
  • 发布或调试版本(即我们链接到哪个版本的CRT)
  • plus:_ITERATOR_DEBUG_LEVEL ...如果每个人都使用默认值,很好,如果项目没有,则必须声明

此外,最佳猜测以下项目:

  • /O一定无关紧要 - 我们不断地将二进制文件与不同的优化设置混合和匹配 - 具体来说,这甚至适用于同一二进制文件中的目标文件
  • /volatile - 因为这是一个代码生成的东西,我很难想象这会如何打破ABI
  • /EH - 除了禁用所有异常的选项,在这种情况下你显然无法调用任何抛出的内容,我非常有信心这是从ABI角度保存的:有可能存在陷阱,但我认为它们无法真正归入ABI compat。 (也许一些复杂的回调链可以说是ABI不兼容,不确定)

其他:

  • 默认调用约定(/G..):我认为这会在链接时断开,当受损的导出符号和标题声明不匹配时。
  • /Zc:wchar_t - 会在链接时断开(它实际上与ABI兼容,但这些符号不会发生。)
  • 启用RTTI(/GR) - 不太确定'关于这个 - 我从来没有使用过此禁用。