重复:我正在寻找相同的 Visual-C ++版本的库之间的ABI兼容性!
我们希望混合和匹配来自不同团队的一些内部C ++ DLL - 使用不同的项目文件在不同时间构建。由于构建时间较长,我们确实希望避免大型单片构建,其中每个团队重新编译另一个团队库的源代码。
当使用C ++接口消耗C ++ DLL 时,rather clear that只有在使用相同的编译器/ Visual编译所有DLL时才能执行此操作Studio版本。
对我来说,显而易见的是 ,确实需要与ABI兼容。
_DEBUG
)和release(NDEBUG
)不能混用 - 但是这些链接到不同版本的共享运行时的事实也很明显/O
切换 - 优化级别是否会影响ABI兼容性? (我很确定不会。)/EH
switch?/volatile:ms|iso
......?基本上,我想提出一组(元)数据来与描述它的ABI兼容性的Visual-C ++ DLL相关联。
如果存在差异,我现在只关注VS2015。
答案 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兼容性,我可以初步列出以下内容:
vc140
现在应该足够了 - 考虑到CRT的链接方式,版本化CRT组件的所有可能的错误修正都必须是ABI兼容的,因此建立给定预编译库的版本并不重要。 _ITERATOR_DEBUG_LEVEL
...如果每个人都使用默认值,很好,如果项目没有,则必须声明此外,最佳猜测以下项目:
/O
一定无关紧要 - 我们不断地将二进制文件与不同的优化设置混合和匹配 - 具体来说,这甚至适用于同一二进制文件中的目标文件/volatile
- 因为这是一个代码生成的东西,我很难想象这会如何打破ABI /EH
- 除了禁用所有异常的选项,在这种情况下你显然无法调用任何抛出的内容,我非常有信心这是从ABI角度保存的:有可能存在陷阱,但我认为它们无法真正归入ABI compat。 (也许一些复杂的回调链可以说是ABI不兼容,不确定)其他:
/G..
):我认为这会在链接时断开,当受损的导出符号和标题声明不匹配时。/Zc:wchar_t
- 会在链接时断开(它实际上与ABI兼容,但这些符号不会发生。)/GR
) - 不太确定'关于这个 - 我从来没有使用过此禁用。