Visual Studio 2015: v120与v140有何区别?

5

提示:Win10,x64

今天我开始尝试使用Visual Studio 2015,弄清楚如何运行C/C++部分后,我试图加载一个使用非官方glsdk的大型个人项目。我试图构建并获得了链接器错误。它抱怨在freeglutD.lib、glloadD.lib和glutil.lib中引用了未解析的外部符号。它还抱怨我的文件中_MSC_VER不匹配。

我在网上进行了一些研究,尝试使用2013和编译器版本(项目属性->常规->平台工具集)-v120用于2013和v140用于2015,并成功使用v140重新构建了glsdk(由于缺少文件而排除glmesh)。然后……它可以正常工作。

问题:为什么会这样?我认为由符合标准的编译器创建的静态库文件应该与其他版本的符合标准的编译器(在此情况下,v120和v140上的C/C++)一起使用。但是显然,v140无法使用以前编译器创建的库。

如果这只是VS构建例程的黑暗领域,那么我可以放弃这个问题,但我也想知道为什么它们不能一起工作。


1
这篇文章对您有帮助吗?它太长了,无法在此重复 :)。请访问http://siomsystems.com/mixing-visual-studio-versions/。 - JCx
5
这是VC++的工作方式 - 每个新版本都有全新的库。 - Bo Persson
将使用旧版本编译器的.h文件和C++标准库构建的代码与新版本运行时代码进行链接是相当冒险的,特别是随着C++11、14和17的设计变化。可能会起作用,也可能会产生真正令人困惑的内存损坏错误。MSVC++编译器有一个1-800支持电话号码。如果你问接电话的人哪个更好,“强制重新编译还是冒险?”,他们总是有相同的答案。这启发了_MSC_VER检查。你可以打败它们,但现在为时已晚 :) - Hans Passant
每个版本都有新的库?我不记得需要为VS 2013重新编译glsdk了。可能是我忘了。 - John Cox
1个回答

2

历史上,Visual C++在每个主要版本之间破坏了运行时库之间的二进制兼容性。这提供了一些自由度,可以改善实现而不受先前版本ABI的限制。

然而,从Visual C++ 2015开始,他们重新设计了运行时库,以一种应该允许他们提供向前兼容性的方式,但这并不能解决向后兼容的问题。

请参阅这篇博客文章和他们发布的有关“通用CRT”的少数跟进文章。


1
链接已迁移到此处 - Radical Ed
@RadicalEd:谢谢!我已经在帖子中更新了链接。 - Adrian McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接