visual-c++ - 使用在不同时间/团队编译的同一 VS 中的 C++ DLL - ABI 兼容性?

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

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

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

当使用带有 C++ 接口(interface)的 C++ DLL 时,它是 rather clear that只有使用相同的编译器/Visual Studio 版本编译所有 DLL,您才能执行此操作。

对我来说不太明显的是,要获得 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。

    最佳答案

    过去几天一直在考虑这个问题,我所做的是尝试看看是否存在一些用例,开发人员已经需要对其 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 兼容性,我可以初步列出以下内容:
  • VC 版本(即使用的 C 和 CPP 运行时库的版本)
  • 这里的一点是,例如vc140现在应该足够了 - 考虑到 CRT 的链接方式,所有可能的版本化 CRT 组件的错误修复都必须与 ABI 兼容,因此构建给定预编译库的版本无关紧要。

  • 纯原生 |托管 (/CLI) | WinRT
  • 如何使用 CRT(静态/动态)
  • 位数/平台(Win32、x64、ARM 等)
  • 发布或调试版本(即我们链接到的 CRT 版本)
  • 加:_ITERATOR_DEBUG_LEVEL ...如果每个人都使用默认值,很好,如果项目没有,它必须声明

  • 此外,我对以下项目的最佳猜测:
  • /O一定不要紧——我们不断混合和匹配具有不同优化设置的二进制文件——特别是,这甚至适用于同一二进制文件中的目标文件
  • /volatile - 因为这是一个代码生成的东西,我很难想象这会如何破坏 ABI
  • /EH - 除了禁用所有异常的选项,在这种情况下你显然不能调用任何抛出的东西,我非常有信心从 ABI 的角度来看这是保存:这里可能存在陷阱,但我认为他们不能真的归类为 ABI 兼容。 (可能有些复杂的回调链可以说是ABI不兼容,不确定)

  • 其他:
  • 默认调用约定(/G..):我认为这会在链接时中断,当损坏的导出符号和 header 声明不匹配时。
  • /Zc:wchar_t - 将在链接时中断(它实际上与 ABI 兼容,但符号不会匹配。)
  • 启用 RTTI (/GR) - 不太确定这个 - 我从来没有使用过这个禁用。
  • 关于visual-c++ - 使用在不同时间/团队编译的同一 VS 中的 C++ DLL - ABI 兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178865/

    相关文章:

    c++ - 如何将变量放在内存中给定的绝对地址(使用 Visual C++)

    math - 是否有用于呈现数学公式的 Visual C++ 库?

    c++ - 如何在 FreeLibrary 调用后强制 Visual Studio 2015 解锁 .PDB 文件?

    c++ - C++ ABI如何处理RVO和NRVO?

    android - 生成 x86 版本的 android App Bundle

    x86 - ELF 或二进制文件中有特定 ABI 的签名吗?

    c++ - 将 vector 模拟为二维数组

    c++ - 低级鼠标钩子(Hook) - 鼠标在断点处卡住

    c# - Roslyn 分析器规则不会使构建失败

    visual-studio-2015 - VS2015 pubxml : how to exclude or eliminate the <PublishDatabaseSettings> section