6

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

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

编辑:

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

4

2 回答 2

2

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

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

于 2013-03-13T00:21:31.580 回答
0

据我所知,GCC 4.7 及更高版本有 ABI 修改。您可以尝试低于该版本的版本。

它也可能有助于使用-std=gnu++11而不是-std=c++11. 为什么这到底是我不知道,但它对我有用。

于 2013-03-12T13:56:55.777 回答