C++ Visual Studio 2012更新是否会中断C++;艾比?
当微软在2012年9月首次发布VisualStudio2012时,他们宣布计划更定期地为VisualStudio提供更新。自那以后,他们分别于2012年11月和2013年4月发布 我的问题是:更新是否对C++ ABI(关于最初的VS2012版本)进行了任何更改?链接不同VS2012版本的C++ Visual Studio 2012更新是否会中断C++;艾比?,c++,visual-studio-2012,abi,C++,Visual Studio 2012,Abi,当微软在2012年9月首次发布VisualStudio2012时,他们宣布计划更定期地为VisualStudio提供更新。自那以后,他们分别于2012年11月和2013年4月发布 我的问题是:更新是否对C++ ABI(关于最初的VS2012版本)进行了任何更改?链接不同VS2012版本的.lib安全吗 我在互联网上搜索了一段时间,没有找到微软的任何明确声明。有人提到C++代码生成中的一些错误已经被修复,但我想这并不意味着ABI的改变吗? < P> Stephan T. Lavavej,Visua
.lib
安全吗
我在互联网上搜索了一段时间,没有找到微软的任何明确声明。有人提到C++代码生成中的一些错误已经被修复,但我想这并不意味着ABI的改变吗? < P> Stephan T. Lavavej,VisualC++的STL实现的一个主要作者在这方面给出了规则: 以下是精确的规则:
如果你包含任何C++标准库头,你必须按它的规则来播放,我们故意破坏主要版本之间的二进制兼容性(但是在热修复和服务包之间保存)。任何表示形式的更改(包括但不限于添加/删除数据成员)都会破坏二进制兼容性,这就是为什么总是发生这种情况,也是为什么我们小心翼翼地捍卫这一权利
[剪报] 因此,如果您遵守STL的规则,您需要确保以下几点:- 链接到单个二进制文件(EXE/DLL)的所有对象文件和静态库必须使用相同的主版本进行编译。我们添加了链接器检查,因此不匹配的VS 2010+主要版本将在链接时触发硬错误,但如果涉及VS 2008或更早版本,我们无法帮助您(没有时间机器)。因为ODR适用于这里,所以您确实应该对所有对象文件和静态库使用相同的工具集(即相同的service pack级别)。例如,我们修复了VS 2010 RTM和SP1之间的std::string内存泄漏,但如果混合使用RTM和SP1,则生成的二进制文件可能会受到泄漏的影响,也可能不会受到泄漏的影响。(此外,您需要使用相同的_迭代器_调试_级别和发布/调试设置;我们现在有链接器检查。)
- 如果你有多个二进制文件加载到同一进程中,并且它们通过C++标准库对象,那么这些二进制文件必须用相同的主版本和ApdiaTraceDebug的级别设置(释放/调试也应该匹配,我忘记了如果你可以在这里不匹配)。重要的是,我们无法检测到违反此规则的行为,因此由您来执行
- 接口纯为C或COM(或现在的WinRT)的多个二进制文件可能在内部使用不同的主要版本,因为这些东西保证了二进制兼容性。如果你的接口涉及C++核心语言(例如,有虚拟的东西),但是非常小心地不提任何C++标准库类型,那么你可能是好的-编译器确实试图避免打破二进制兼容性。
最后,我在Stephan T.Lavavej的博文中找到了我问题的答案: VS更新机制主要用于发布高优先级的错误修复,而不是发布新功能,特别是带有中断更改的大规模重写(与同样大规模的编译器更改相关) 主要版本如Visual C++ 2013给我们自由改变和打破很多东西。我们根本不可能在更新中发布这些东西 问题5:修复了哪些错误?我们能更新一下吗 A5:这是一个有趣的问题,因为答案取决于我的选择(而在上一个问题中,即使我愿意,也不允许我在更新中发布这样的重写) 每个团队都可以选择将哪些错误修复带到“shiproom”,以考虑将其包含在更新中。有些事情shiproom不会让我们逃脱(例如,在主要版本之外禁止二进制破坏性更改),但除此之外,我们有权做出决定。我个人认为带宽优先于延迟——也就是说,我更喜欢在每个主要版本中发布更多的错误修复,而不是在多个更新中更频繁地发布更少的错误修复(在同一时间段)
由于此更新,我似乎找不到任何关于ABI损坏的信息。@ddriver:我也找不到,但我也找不到任何关于不损坏ABI的信息,因为是MS Visual Studio,您永远不知道……测试将是最快的发现方法。链接到某个更大的DLL,该DLL很有可能在二进制兼容性中断时遇到问题。然后你将是第一个知道的人谢谢你的报价。我已经知道“STL规则”。关于引文的第一部分,我想我的问题的答案还不是百分之百的清楚,;i、 例如,Stephan T.Lavavej正在谈论“主要版本”和“服务包”。没有明确提及根据新发布策略进行的版本更新。然而,我认为他的文章有力地证明了VS2012.X更新没有破坏ABI兼容性的假设。我只是想知道为什么微软不在他们的更新发布公告中放一个简短的“ABI兼容性保留”说明。