仅供参考:Win10,x64
我今天开始尝试使用Visual Studio 2015,在弄清楚如何运行C / C ++部件后,我尝试加载一个使用unofficial glsdk的大型个人项目。我试图构建并获得链接器错误。它抱怨freeglutD.lib,glloadD.lib和glutil.lib中引用了未解析的外部符号。它还抱怨我自己的文件中的_MSC_VER不匹配。
我在网上做了一些研究,乱搞了2013年和编译器版本(项目属性 - >一般 - >平台工具集)) - 2013年的v120和2015年的v140 - 并且能够用v140重建glsdk(不包括glmesh由于缺少文件)。然后......它工作正常。
问题:为什么会这样?我认为由符合标准的编译器创建的静态lib文件可以与标准兼容编译器的其他版本一起使用(在本例中,v120上的C / C ++和v140上的C / C ++)。但显然v140不会与之前编译器生成的库一起玩。
如果这只是VS构建惯例的黑暗之地,那么我可以放弃这个问题,但我也想知道为什么他们不能一起工作。
答案 0 :(得分:2)
从历史上看,Visual C ++已经破坏了每个主要版本的运行时库之间的二进制兼容性。这为改进实现提供了一些自由,而不受先前版本的ABI约束。
然而,从Visual C ++ 2015开始,他们以一种允许它们提供兼容性的方式重新构建了运行时库,但这并没有解决问题的倒退。
请参阅此blog post以及他们发布的有关“通用CRT”的一些后续内容。