首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于“Visual Studio 2015与Visual Studio 2017之间的二进制兼容性”的问题

关于“Visual Studio 2015与Visual Studio 2017之间的二进制兼容性”的问题
EN

Stack Overflow用户
提问于 2018-11-07 07:19:55
回答 1查看 1.6K关注 0票数 2

https://learn.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017说,确保Visual 2015和Visual 2017之间的C++二进制兼容性,除了:

1)当使用/GL编译器开关编译静态库或对象文件时。 2)在使用用工具集构建的库时,其版本大于用于编译和链接应用程序的工具集。例如,编译并链接到编译器版本19.12的程序可以使用从19.0到19.12编译的库。此外,仅在Visual 2015和Visual 2017之间存在二进制兼容性;不支持将19.x程序链接到Visual 2013或更早版本生成的库。

例外2让我很困惑。为什么在这种情况下不能保证二进制兼容性?

让我们说得更具体些。提供一个包含自定义exe、自定义dll和部分vc_toolset dll(v140或v141)的文件夹。自定义exe和自定义dll都动态地链接到部分vc_toolset dll,其中包括CRT、msvcp140.dll、vcruntime140.dll。此外,未启用/GL选项。

我在下面列出几个组合。我怀疑每个人的二进制兼容性。

1) vs2015 + dll构建的exe,由vs2015 + v140工具集vs2015构建

我认为在这种情况下可以保证二进制兼容性。

2) vs2015 + dll构建的exe,由vs2015 + v141工具集vs2017构建

此外,基于案例1,工具集dll被替换为vs2017附带的更新版本。

此外,我认为在这种情况下可以保证二进制兼容性。

3) vs2015 + dll 编译的,用vs2017 + v140工具集dll of vs2015重建

基于案例1,使用vs2017重新构建了自定义dll。然后有两种选择:

( a)只需替换dll,就不会使用新dll的导入库重新生成exe

( b)替换dll并使用新dll的导入库重新生成exe。

根据上述链接的例外2,在a)和b)情况下,不能保证二进制兼容性。但为什么?自定义dll的所有接口和依赖项都不改变,也不依赖v 141的新特性。

4) vs2015 + dll 编译的,由vs2017 + v141工具集dll of vs2017重建

此外,基于案例3,工具集dll被替换为vs2017附带的更新版本。

5)exe 通过vs2015 + v140工具集dll构建的vs2017 +dll重建

基于案例1,使用vs2017重新构建自定义exe,并与以前由vs2015构建的自定义dll导入库链接。

根据上面的链接,我认为在这种情况下可以保证二进制兼容性。

6)通过vs2015 + v141工具集vs2015+v141构建的vs2017 + dll重建

此外,基于案例5,工具集dll被替换为vs2017附带的更新版本。如果案例5和案例2能够得到保证,我认为在这种情况下也是有保证的。

我的理解正确吗?

EN

回答 1

Stack Overflow用户

发布于 2018-11-07 07:36:06

你提到的这篇文章的要点是微软增加了MSVS 2015和MSVS 2017二进制文件之间的c兼容性的可能性。

它只列出两个例外:

https://learn.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017 Visual 2015与Visual 2017 C++二进制兼容性 在Visual的早期版本中,使用不同版本的编译器工具集和运行时库构建的对象文件(OBJ)、静态库(LIB)、动态库(DLL)和可执行文件(EXE)之间的二进制兼容性得不到保证。 这种情况在Visual 2017中已经发生了变化。在Visual 2015和Visual 2017中,C++工具集的主要编号为14 (v140表示Visual 2015,v141表示Visual 2017)。这反映了这样一个事实:运行时库和使用编译器的任一版本编译的应用程序--大部分是二进制兼容的。 例如,这意味着,如果在Visual 2015中有一个DLL,则不必重新编译它,就可以从使用Visual 2017构建的应用程序中使用它。 这条规则有两个例外。在这些情况下,不能保证二进制兼容性:

  1. 使用/GL编译器开关编译静态库或对象文件时。
  2. 当使用用工具集构建的库时,其版本大于用于编译和链接应用程序的工具集。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53185019

复制
相关文章

相似问题

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