繁体   English   中英

VS2012 与 VS2019 的兼容性

[英]VS2012 compatibility with VS2019

所以,我知道微软增强了他们的工具集,使得使用 VS2015、VS2017 和 VS2019 构建的应用程序和库之间存在兼容性。

但是,我认为这种组合会失败:使用 VS2012 (VC11) 的工具集构建的 C++ 应用程序 (.exe),在运行时与包含 C++ 的共享库 (.dll) 链接使用 VS2019 的工具集构建

但是,我们已经看到这种组合“似乎”有效。

我预计这种组合会失败,但无法解释它的成功。 有人对此有任何想法吗?

Microsoft Docs中涵盖的 VS 2015 Update 3、VS 2017 和 VS 2019 之间的“二进制兼容性”专门围绕标准 C++ 库和 static 库链接。 历史上不同代的工具集将无法链接或在运行时崩溃。 为避免崩溃,VS 添加了这些符号,因此您会在链接时收到错误:

error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj

VS 2015 Update 3、VS 2017 和 VS 2019 都使用“1900”作为链接标记,因为它们经过设计和测试可以在混合时工作。 当然,重要的是要注意最终链接预计将针对较新的 CRT 库和 linker(即它仅向前兼容)。 仅当使用 C++ 标头而不是 C 标头或 Win32 系统标头时,才会拉入链接标记。

For example, if you had a C++ library that had inline functions that worked on a std::vector in the class implementation, and the rest of the class was hosted in a DLL, historically this would fail if you built with different toolsets because the std::vector的实现将使用不同的二进制布局等。这是在工具集之间拥有这种“二进制兼容性”策略的关键价值,因此使用最新的工具集并保留大多数现有的 3rd 方库和工具。

通过导入库的 C ABI 始终适用于编译器版本。 这在很大程度上是 Win32 API 和 COM API 托管在 DLL 中并使用 C ABI 的原因。 否则,编译器工具集的每个版本都需要一组新的操作系统库。 从理论上讲,您可以使用古老的 Platform SDK 之一中提供的库成功地将程序与 VS 2019 链接起来。

所以这真的取决于你的 exe 使用的是什么。 如果它只是使用 C API、外部“C”链接和/或 Win32 API,那么无论您使用什么组合,它都可以正常工作。

TL;DR:使用 C ABI 的动态链接库可以跨工具集工作。 Static 库或具有 C++ ABI 的库仅在特定场景中跨工具集工作。

这里还有一个警告:全程序优化/链接时代码生成 static 库在工具集之间不兼容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM