g ++中的C ++ 11语言支持,没有`-std = c ++ 11`的库破坏功能

时间:2013-03-11 21:34:19

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

有没有办法告诉g++启用C ++ 11的新语言功能,而不会因ABI修改而对标准C ++库进行任何重大更改?

添加-std=c++11编译标志告诉g++启用语言和库功能,但是以这种方式创建的目标文件无法与使用不同-std=设置的目标文件安全地链接。我希望能够使用语言增强功能,如右值引用,移动构造函数(对于我自己的类),以及与C ++ 03库链接的代码中的auto关键字。

修改

我对g++启用其C ++ 11 语言功能感兴趣,但我希望它能够解析,编译和链接旧的C ++ 03库。我不希望它使用标准库的C ++ 11版本。这意味着在我自己的代码中,我将能够使用auto,范围foreach构造,rvalue引用等,但我能够使用新的C ++ 11标准C ++库中的特性,如std::move或对STL容器的rvalue-ref增强。不想要标准库的C ++ 11版本的原因是各种对象的布局已经改变,因此将期望不同版本的标准库的两个目标文件链接到同一个二进制文件中是无效的。

2 个答案:

答案 0 :(得分:2)

不,你不能在没有C ++ 11库功能的情况下启用C ++ 11语言功能(不是没有编辑libstdc ++头来删除所有C ++ 11部分。)

但是没有许多不兼容的符号(只要你不使用4.7.0或4.7.1,它们具有不兼容的std::list,还原为4.7.2)所以你可能只需要担心RB树容器的erase()成员。您可以确保在主可执行文件中定义了符号的C ++ 11版本,因此所有需要它的代码都将使用该符号的版本。期望C ++ 03版本的其他库中的代码将忽略返回值,期望C ++ 11版本的代码将能够使用返回值。

答案 1 :(得分:0)

据我所知,GCC 4.7及以上版本有ABI修改。您可以尝试以下版本。

使用-std=gnu++11代替-std=c++11也可能有所帮助。为什么我确实不知道,但它对我有用。