2016-06-27 43 views
5

我有以下情况:用GCC混合不同的C++标准

有两个组件,一个是用C++ 11编写的,另一个是用C++ 98编写的。 两者都使用相同的GCC 4.9从头开始编译。一个使用隐式默认--std=gnu++98另一个明确设置--std=c++11

即使做了一些研究,我也无法完全回答这个问题,如果这可能会导致问题。

GCC wiki说:

的C++语言98 ABI是兼容的C++语言的11,但在图书馆休息兼容性好几个地方。这使得将C++ 98对象与C++ 11对象链接起来非常危险。如果您可以使用该语言的匹配版本重新编译代码,则应该这样做。

这表明问题是可以预料的。

所以问题是:

  1. 有没有,如果有--std=gnu++98--std=c++11建造的两个部件连接在一起的问题,甚至是艰难的,他们使用相同的libstdc++和相同的编译器(GCC 4.9)都建?

  2. 请问Dual ABI支持形式GCC 5.1在这种情况下有影响吗?

+0

我建议只用'-std = C++ 11'(或GNU方言)构建。 –

+0

这将是理想的,但在这种情况下,第一个组件的编译无法在使用C++ 98更新的情况下编译时进行编译,并且现在无法进行更改。 – Pascal

+0

使用'std :: string'?其次,那些打破变化的人,也许你应该对他们感到害怕:许多“休息”可能是实际的错误。 – Yakk

回答

0

1)例如,您提到的lib的某些部分的实现更改可能会有问题。

2)是的。

我会重新编译两个C++版本中的一个。如果这不是一个选择(第三方库等)使用双重ABI机制可能是一个解决方案。要非常小心它在不同版本的代码之间共享的内容。

您提到的wiki的部分内容涉及例如旧代码尝试执行不再支持的内容(语义不同但语法相同)的情况。

+0

关于答案1)你的意思是,问题是'libstdC++'的界面在C++ 98和C++ 11之间改变了。还是仅仅因为它们可能会略有不同而出现错误?在第二种情况下,如果代码根据C++标准正确无误,这不应该发生? – Pascal

+0

两者。由于您使用GCC 4.9,因此您可能不会遇到任何此类问题(您将使用libstdC++的旧实现),但您必须注意的是其他不同库,您不知道依赖关系。在libstdC++中,你很幸运,因为这些更改是与命名空间一起内联的,如果有这种问题,链接器会警告你。这可能会或可能不会发生与其他图书馆(例如助推器存在在这种情况下痛苦的高风险)。 – Robbykk