仅供参考: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构建例程的黑暗之地,那么我可以放弃这个问题,但我也想知道为什么它们不能一起工作。
从历史上看,Visual C ++已经破坏了每个主要版本的运行时库之间的二进制兼容性。这提供了一些自由来改进实现,而不受先前版本的ABI约束。
但是,从Visual C ++ 2015开始,他们以一种允许它们提供兼容性的方式重新构建了运行时库,但这并没有解决问题的倒退。
看看这个blog post以及他们发布的关于“Universal CRT”的一些后续内容。