【问题标题】:Does using -std=c++11 break binary compatibility?使用 -std=c++11 会破坏二进制兼容性吗?
【发布时间】:2014-07-15 11:30:12
【问题描述】:

我一直在努力寻找这个问题 - 这似乎是一个显而易见的问题 - 但我没有找到它:Is a module compiled with "-std=c++11" (g++) binary compatible with modules that是不是用选项编译的? (也就是说,我可以安全地将它们链接在一起吗?)两种编译都将使用完全相同的 g++ 版本。

更准确地说,使用gcc 4.9.0,我可以只在特定的编译单元上使用“-std=c++11”,然后让其他编译单元没有选项。

【问题讨论】:

  • 我预计不会,但很难 100% 确定。有什么理由不能全部重新编译?
  • 好吧,C++11 与以前的标准不兼容,我不确定 ABI 或二进制文件,但无论如何我都不会这样做。如果你要使用 C++11,你应该只使用 C++11。
  • 我曾经有过a similar question

标签: c++ c++11 g++


【解决方案1】:

权威参考可以在 gcc 的C++11 ABI Compatibility 页面中找到。

简短的总结是:ABI 被破坏不是语言原因,但有一些强制更改导致标准 C++ 库随 gcc 一起更改。

【讨论】:

  • 除非你喜欢在 11 岁之前使用已弃用的 auto,在这种情况下,他们应该爬出洞穴。
  • @user2485710:请注意,ABI 更改和行为更改是两件不同的事情。虽然改变行为是一个问题,但改变 ABI 可以被视为一个更大的问题,特别是如果 ABI 的改变导致结果仍然链接。
  • @John:根据链接页面,如果您在不同的翻译单元中不使用标准 C++ 库中的任何内容,应该没问题。当你接触到任何接触标准 C++ 库的东西时,你需要对你正在做的事情非常小心。简单的答案是:不要混合使用不同选项构建的目标文件。但是,这可能不可行,而且当您混合构建选项时,没有简单的答案。
  • @user2485710:遗憾的是,对于大型代码库,并不总是可以使用一致的设置。在这些情况下,什么有效,什么无效当然很重要。
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2015-07-06
  • 2016-08-20
  • 2013-03-08
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多