首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与VS2019的VS2012兼容性

与VS2019的VS2012兼容性
EN

Stack Overflow用户
提问于 2021-04-23 05:37:39
回答 1查看 123关注 0票数 0

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-04-23 05:42:57

VS 2015更新3、VS 2017和VS 2019之间的Microsoft Docs所涵盖的“二进制兼容性”是专门围绕标准C++库和静态库链接的。从历史上看,不同代的工具集将无法链接或在运行时崩溃。为了避免崩溃,VS添加了这些符号,这样在链接时就会出现错误:

代码语言:javascript
运行
复制
error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj

VS 2015更新3、VS 2017和VS 2019都使用'1900‘作为链接戳,因为它们被设计和测试为混合工作。当然,重要的是要注意,最终的链接应该是针对较新的CRT库和链接器的(即它只是向前兼容的)。只有在使用C++标头时才拉入链接戳,而不是使用C标头或Win32系统标头。

例如,如果你有一个C++库,它的内联函数在类实现中的std::vector上工作,而类的其余部分托管在DLL中,那么在历史上,如果你使用不同的工具集构建,这将会失败,因为std::vector的实现将使用不同的二进制布局,等等。这是在工具集之间具有这种“二进制兼容性”策略的关键价值,这样可以更容易地使用最新的工具集,并保留现有的大多数第三方库和工具。

通过导入库的C ABI总是可以在不同的编译器版本之间工作。这在很大程度上就是为什么Win32 API和COM API驻留在DLL中并使用C ABI的原因。否则,编译器工具集的每个版本都需要一组新的OS库。从理论上讲,您可以使用一个古老的平台SDK中附带的库,成功地将程序与VS 2019相链接。

因此,这实际上取决于您的exe使用的是什么。如果它只使用APIs、外部"C“链接和/或Win32 API,那么无论您使用哪种组合,它都会工作得很好。

TL;DR:使用C ABI的动态链接库跨工具集工作。静态库或带有C++ ABI的库只能在特定情况下跨工具集工作。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67221109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档