Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio 2012更新是否会中断C++;艾比?_C++_Visual Studio 2012_Abi - Fatal编程技术网

C++ Visual Studio 2012更新是否会中断C++;艾比?

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

当微软在2012年9月首次发布VisualStudio2012时,他们宣布计划更定期地为VisualStudio提供更新。自那以后,他们分别于2012年11月和2013年4月发布

我的问题是:更新是否对C++ ABI(关于最初的VS2012版本)进行了任何更改?链接不同VS2012版本的
.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++标准库类型,那么你可能是好的-编译器确实试图避免打破二进制兼容性。
但是,请注意,当加载到单个进程中的多个二进制文件使用不同的主版本进行编译时,您几乎肯定会在进程中加载多个CRT,这是不可取的

底线——如果你100%一致地编译所有东西,你就不必担心这些东西。如果可以避免的话,不要玩混合游戏


最后,我在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兼容性保留”说明。