2017-05-31 190 views
0

This SO post: Is Visual-C++-2017 binary compatible with VC++-2015?很明显地说VS 2016与VS 2015是二进制兼容的,它甚至看起来像官方位置。VS2017和VS2015之间的二进制兼容性

我的问题是,在过去,我清楚地记得运行到链接器错误(我不记得具体的一组错误),每次我试图链接在一个静态库编译了不同版本的MSVC转换为使用MSVC的新版本构建的EXE。

然而,二进制(in)的兼容性听起来像是在你的脸上炸开运行时,而不是链接时间。

有人能告诉我,如果以前版本的MSVC在版本不匹配时确实生产链接器错误?这是如何完成的?

编辑

这将如何影响与WPO/LTCG内置静态库是否已开启?我相信这些产生中间目标文件(而不是COFF),而且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞。

+0

https://msdn.microsoft.com/en-us/library/ee956429.aspx –

+0

@HansPassant对不起,我不明白。你说的是用VS2013构建的静态库,会自动放置一个pragma_detect指令,但是如果我试图从不同的编译器链接到它,链接器错误会显示出来吗? (即没有我介入?) – ForeverLearning

+1

“自动”不完全是正确的词。此#pragma出现在您在程序中使用的#include文件中。这是一个通用机制,编译器的包含文件只是利用它来检测严重不匹配。它将/ FAILIFMISMATCH“foo = bar”链接器指令嵌入到目标文件中,链接器仅收集所有的foos并验证它们是否都是条形码。只需grep在#pragma的vc/include目录中的文件就可以看到它们正在被使用。 –

回答

2

正如我回答了链接的问题,V140 VS 2015中的工具集和VS 2017中的v141工具集是二进制兼容的。 v141被建立为同一个“家族”的成员,因为v140的所有更新(例如,VS 2015 Update 1,2,3)都在同一个家族中。这是一个有意的设计决定,可帮助开发人员转向新版本的VS,而不必担心必须对其源代码进行更改。

VS 2017可以支持多种工具集。下一个工具集不会与v140/v141二进制兼容。但是,当您将代码移动到与下一个工具集中的新C++功能兼容时,您仍然可以安装v141。

请注意,我们从来没有支持跨主要版本的二进制兼容性。无论使用WPO/LTCG /等,您都无法链接使用v140构建的二进制文件和使用v130构建的二进制文件。是的,它经常起作用 - 我们试图最大限度地减少我们的库中的重大更改,因此经常会发生这样的情况,即在主要版本之间链接某些代码不会产生任何错误。但最终你会遇到一些变化,你会看到一个错误。

至于您是否看到链接错误或运行时错误,取决于您调用的不兼容库API。如果导出的API形状发生变化 - 函数名称,参数数量 - 则链接器将无法找到它。如果形状相同但行为已更改,则可能会导致运行时失败。

--Andrew帕多,MSVC工具

+0

谢谢安德鲁。 WPO/LTCG问题背后的一点是,我不确定二进制兼容性是否处理中间目标文件格式。由于IIUC除了二进制兼容以外,WPO/LTCG的问题是目标文件格式因工具链而异。 – ForeverLearning

+0

是的,正如我所说:你可能能够跨发布版本链接一些代码,但最终你会遇到一些破坏。 – apardoe

+0

v141和v140_xp怎么样?我正在将一个v140_xp项目转换为v141,并且突然发生由asp.net dll导致的崩溃,该崩溃并没有特定的版本工具集,据我所知 –