VS2017和VS2015之间的二进制兼容性

For*_*ing 2 abi binary-compatibility visual-c++-2015 visual-c++-2017

这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.

我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.

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

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

编辑

这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.

apa*_*doe 5

正如我在链接问题上回答的那样,VS 2015中的v140工具集和VS 2017中的v141工具集是二进制兼容的.v141是作为同一"家庭"的成员构建的,因为对v140的所有更新(例如,VS 2015 Update 1,2,3)都在同一系列中.这是一个有意的设计决策,可帮助开发人员迁移到新版本的VS,而无需担心必须对其源代码进行更改.

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

请注意,我们从未在主要版本之间支持二进制兼容性.无论WPO/LTCG /等等,您都无法链接使用v140构建的二进制文件和使用v130构建的二进制文件.是的,它经常有效 - 我们尝试最小化我们库中的重大变化,因此通常情况下,将主要版本之间的某些代码链接起来不会出现任何错误.但最终你会遇到一些变化的东西,你会看到一个错误.

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

- 安德鲁·帕多,MSVC工具