C++ 使用-std=c++;11中断二进制兼容性?

C++ 使用-std=c++;11中断二进制兼容性?,c++,c++11,g++,C++,C++11,G++,我努力寻找这个问题——这似乎是一个显而易见的问题——但我没有发现:使用“-std=c++11”(g++)二进制编译的模块是否与未使用该选项编译的模块兼容?(也就是说,我可以安全地将它们链接在一起吗?)这两个编译将使用完全相同的g++版本 更准确地说,使用gcc 4.9.0,我只能在特定的编译单元上使用“-std=c++11”,然后让其他编译单元不使用该选项。可以在gcc的页面中找到权威参考 简短的总结是:没有语言原因,ABI被破坏了,但是有许多强制性的变更导致GCC的标准C++库的传输发生变化。

我努力寻找这个问题——这似乎是一个显而易见的问题——但我没有发现:使用“-std=c++11”(g++)二进制编译的模块是否与未使用该选项编译的模块兼容?(也就是说,我可以安全地将它们链接在一起吗?)这两个编译将使用完全相同的g++版本


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

可以在gcc的页面中找到权威参考


简短的总结是:没有语言原因,ABI被破坏了,但是有许多强制性的变更导致GCC的标准C++库的传输发生变化。

我预计它不会,但是很难确定100%。有什么原因不能全部重新编译吗?好吧,C++11与以前的标准不兼容,我不确定ABI或二进制文件,但无论如何我不会这么做。如果你选择C++11,你应该只使用C++11。我曾经使用过。例如,除非你喜欢使用11之前不推荐的
auto
,否则他们应该爬出洞穴。@user2485710:请注意,ABI更改和更改的行为是两件不同的事情。虽然改变行为是一个问题,但是改变ABIS可以被看作是一个更大的问题,尤其是如果ABI以某种方式改变导致结果仍然链接。@约翰:根据链接页面,如果你不使用标准的C++库中的任何不同的TENASLE单位,它应该是可以的。当你触摸任何东西C++标准库时,你需要对你所做的事情相当小心。简单的答案是:不要混合使用不同选项生成的对象文件。但是,这可能不可行,而且在混合构建选项时,没有简单的答案。@user2485710:遗憾的是,对于大型代码库,不可能始终使用一致的设置。在这些情况下,什么有效,什么无效当然很重要。