使用/ GL时,向后兼容性会中断

时间:2019-02-12 09:26:20

标签: c++ visual-studio

为了构建适用于ARM64设备的应用程序,我们将VS 2017 15.5.7升级到15.9.6版本。发布后,当由测试应用程序(在15.5.7上构建)使用时,使用/ GL标志构建的(15.9.6)库现在会引发“无法识别的标志”错误,如下所示:

1>LINK : fatal error C1007: unrecognized flag '-Ot' in 'p2'
1>LINK : fatal error LNK1257: code generation failed

一旦在项目设置中禁用了“整个程序优化(/ GL)”,客户端构建就会通过。

谁能检查从15.5.7版本更改到现在引发此链接错误的内容? 此外,建议的最佳项目设置是什么。

1 个答案:

答案 0 :(得分:3)

当您说使用此选项破坏了向后兼容性时,您是对的。

Officially :

  

整个程序优化允许编译器使用程序中所有模块的信息进行优化。如果没有整个程序的优化,则优化是基于每个模块(compiland)进行的。

而且,即使被提及为between Visual Studio 2015 and Visual Studio 2017,也仍然是正式的:

  

在以下情况下不能保证二进制兼容性:

     
      
  1. 使用/ GL编译器开关编译静态库或目标文件时。
  2.   
  3. 使用使用工具集构建的库时,该工具集的版本大于用于编译和链接应用程序的工具集。例如,被编译并与编译器版本19.12链接的程序可能会消耗从19.12到19.12为止编译的库。此外,二进制兼容性仅在Visual Studio 2015和Visual Studio 2017之间存在;其他情况下,二进制兼容性不存在。不支持将19.x程序与Visual Studio 2013或更早版本生产的库链接。
  4.   

但非正式地说,我可以这样说:

使用此编译器选项,如果您的依赖项之一是使用其他编译器更新(甚至是一些次要更新)构建的,则链接肯定会失败。

实际上,/ GL编译器选项对于DLL和EXE之间的向后兼容性是如此严格,以至于我们决定不再在公司中使用它。

我们有很多DLL,并且EXEcutables构建在不同的项目上。

为了简短起见,在调试时,有时我们需要使用较新的编译器来构建exe,同时使用由较旧的编译器编译的库

此标志阻止这样做。

可能对他人有帮助的解决方案:

  • 使用不带标志的旧编译器重建旧库
  • 使用新的编译器重建旧库,同时保留标志(这意味着在出现新的编译器时始终重建它们)
  • 使用旧的编译器重建新的可执行文件(这意味着没有编译器更新)