重复一遍:我正在寻找相同 Visual-C++ 版本的库之间的 ABI 兼容性!
我们希望混合和匹配来自不同团队的一些内部 C++ DLL——在不同时间使用不同的项目文件构建。由于构建时间长,我们确实希望避免大型单体构建,每个团队都重新编译另一个团队库的源代码。
当使用带有 C++ 接口(interface)的 C++ DLL 时,它是 rather clear that只有使用相同的编译器/Visual Studio 版本编译所有 DLL,您才能执行此操作。
对我来说不太明显的是,要获得 ABI 兼容性,需要完全相同。
_DEBUG
) 和 release ( NDEBUG
) 不能混合使用——但从它们链接到不同版本的共享运行时这一事实也很明显。 /O
需要切换 - 优化级别会影响 ABI 兼容性吗? (我很确定不是。)/EH
switch ? /volatile:ms|iso
... ? 本质上,我想提出一组(元)数据与描述其 ABI 兼容性的 Visual-C++ DLL 相关联。
如果存在差异,我目前只关注 VS2015。
最佳答案
过去几天一直在考虑这个问题,我所做的是尝试看看是否存在一些用例,开发人员已经需要对其 C++ 构建进行分类以确保二进制文件兼容。
一个这样的地方是Native Packages from nuget .所以我在那里查看了一个包,特别是 cpprestsdk :
downloadable package 中的二进制文件像这样 split :
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 二进制文件构建目录以类似的方式分离。因此,要获取元数据列表以识别 ABI 兼容性,我可以初步列出以下内容:
vc140
现在应该足够了 - 考虑到 CRT 的链接方式,所有可能的版本化 CRT 组件的错误修复都必须与 ABI 兼容,因此构建给定预编译库的版本无关紧要。 _ITERATOR_DEBUG_LEVEL
...如果每个人都使用默认值,很好,如果项目没有,它必须声明 此外,我对以下项目的最佳猜测:
/O
一定不要紧——我们不断混合和匹配具有不同优化设置的二进制文件——特别是,这甚至适用于同一二进制文件中的目标文件/volatile
- 因为这是一个代码生成的东西,我很难想象这会如何破坏 ABI /EH
- 除了禁用所有异常的选项,在这种情况下你显然不能调用任何抛出的东西,我非常有信心从 ABI 的角度来看这是保存:这里可能存在陷阱,但我认为他们不能真的归类为 ABI 兼容。 (可能有些复杂的回调链可以说是ABI不兼容,不确定)其他:
/G..
):我认为这会在链接时中断,当损坏的导出符号和 header 声明不匹配时。 /Zc:wchar_t
- 将在链接时中断(它实际上与 ABI 兼容,但符号不会匹配。)/GR
) - 不太确定这个 - 我从来没有使用过这个禁用。 关于visual-c++ - 使用在不同时间/团队编译的同一 VS 中的 C++ DLL - ABI 兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178865/