C++ 将VS2017 15.2升级到15.3会破坏第三方库

C++ 将VS2017 15.2升级到15.3会破坏第三方库,c++,visual-studio,compiler-errors,C++,Visual Studio,Compiler Errors,我最近将我的Visual Studio版本更新为最新版本(主要是因为自动更新,而不是我自愿这样做)。当链接到使用15.2而不是当前版本的15.3构建的第三方库时,这就破坏了我的编译器。我看到的错误是: “Library_Name_here.lib”是使用比其他对象更旧的编译器创建的;重建旧对象和库 我正在寻找解决方案,以避免重新编译这些库,但如果不存在,我正在寻找一种编译库的方法,使其不受版本限制,这样就不必在每次vs更新时都重新编译。几个月前,当我将VS2015升级到VS2017时,我也遇到了

我最近将我的Visual Studio版本更新为最新版本(主要是因为自动更新,而不是我自愿这样做)。当链接到使用15.2而不是当前版本的15.3构建的第三方库时,这就破坏了我的编译器。我看到的错误是:

“Library_Name_here.lib”是使用比其他对象更旧的编译器创建的;重建旧对象和库


我正在寻找解决方案,以避免重新编译这些库,但如果不存在,我正在寻找一种编译库的方法,使其不受版本限制,这样就不必在每次vs更新时都重新编译。

几个月前,当我将VS2015升级到VS2017时,我也遇到了问题,我在visual studio 2015上运行的一个大项目停止了工作。该项目添加了几个类库和外部DLL

因此,我所做的是,卸载了visual studio 2017的升级版本,并从MSDN网站重新安装了完整的visual studio 2017(选择默认功能选项)。然后我在VS2017 fresh copy中加载了我的项目,并添加了所有外部库的引用,它成功了


我建议您尝试相同的

在同一个二进制文件中混合和匹配由不同版本的编译器编译的代码(对象文件或静态库)不是一个好主意

引述:

为了避免难以检测和诊断的运行时错误,我们 建议您永远不要静态链接到 使用不同版本的编译器编译。还有,当你 升级EXE或DLL项目时,请确保升级 它链接到。如果您使用的是CRT(C运行时)或STL(标准模板 库)类型,不要在 使用不同版本的编译器编译。更多 有关详细信息,请参阅


因此,解决方案是使用新的编译器重新编译所有第三方静态库。

这是一个无稽之谈,基于另一个SO答案:

在未启用链接时间代码生成的情况下重新编译其他库(
/GL
/LTCG
)。启用它后,库希望链接器完成大部分编译,而您不能期望一个版本的编译器完成编译,而是希望另一个版本的编译器完成编译

不要在活动项目中禁用它,因为它可以显著提高性能。就在图书馆里


主要的编译器版本可能仍然需要重建第三方库,但不是次要的。

您可以在VS2017中执行此操作。它允许您使用一直追溯到VS2008的工具集

详情见此


希望有帮助

这将取决于该库的功能、使用方式及其接口。处理它的最独立于版本的方法是在COM中封装库,但如果接口丰富,这并不是您所说的容易。完整的答案需要关于库的具体细节。@Yakk我很惊讶VS在一次小升级中有一个破坏性的ABI更改(这是阻止链接的唯一原因)。@sergeyA也让我感到惊讶,但这不是OP所问的问题?我知道他们在15.3版本中更新了编译器,但我很惊讶这会产生一个错误,因为这应该是一个次要的版本更新,而不是主要的版本更新。也许操作会一字不差地引用错误,而不是复制粘贴某个部分…啊哈:--库可能是在启用LTCG的情况下编译的,项目也是在启用LTCG的情况下编译的,更新的编译器不能期望LTCG代码来自早期版本(甚至是微小的差异)。修复方法:重新编译旧库而不生成链接时代码,微小的版本更改是否不再困扰您?也许是这样;需要更多OP.@Yakk的信息,我想你可能知道一些事情。我想这正是我一直在寻找的,也许我会喜欢再找一周。我基本上在谷歌上搜索了所有相关的东西,除了发行号本身。不是我的项目没有编译,而是项目中的第三方库在技术上是用编译器拒绝的旧版本编译的。@Rick你为什么不重新编译这些第三方库(使用新编译器)走你的快乐之路?应该不会花太长时间。正如我已经解释过的,我不想每次visual studio发布更新时都要执行此过程。我知道这不是一个好主意,但我仍在寻找工作around@Rich*但我仍在寻找解决方案*--静态库只不过是打包在更大文件中的对象文件。这些对象文件是由另一个编译器版本生成的。想象一下,你会冒险用一个旧的编译器编译一半的项目,用一个新的编译器编译一半的项目,然后将它们链接在一起,希望所有这些都能工作吗?在大多数情况下,你是正确的。但是,因为我是一个一次性更新所有第三方库(整个项目)的人,所以我可以处理后果。特别是在我试图冻结VisualStudio版本之后,我希望以后再也不会看到这种错误future@Rich没有解决办法。只要始终使用相同的编译器构建所有内容即可。@Rich如果Microsoft建议使用它,并且您有一个provlem,那么您已经知道要做什么了。重新编译库或要求第三方这样做。。。