有没有办法告诉g++启用C++11的新语言特性,而不因ABI修改而破坏标准C++库?
添加-std=c++11编译标志会告诉g++同时启用语言和库特性,但是以这种方式创建的对象文件不能安全地与使用不同-std=设置的对象文件链接。我希望能够使用语言增强,比如rvalue引用、移动构造函数(针对我自己的类),以及与C++03库链接的代码中的C++03关键字。
编辑:
我感兴趣的是让g++启用它的C++11语言特性,但我希望它能够针对旧的C++03库进行解析、编译和链接。我不希望它使用标准库的C++11版本。这意味着,在我自己的代码中,我将能够使用auto、range foreach结构、rvalue引用等,但是我不能在标准C++库中使用新的C++11特性,比如对STL容器的std::move或rvalue-ref增强。不需要标准库的C++11版本的原因是各种对象的布局发生了变化,因此将期望标准库的不同版本的两个对象文件链接到同一个二进制文件是无效的。
发布于 2013-03-13 00:21:31
不,如果没有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版本的代码将能够使用返回值。
发布于 2013-03-12 13:56:55
据我所知,GCC 4.7及以上有ABI修改。您可以尝试下面的版本。
它也可能有助于使用-std=gnu++11而不是-std=c++11。为什么我不知道,但这对我有用。
https://stackoverflow.com/questions/15349095
复制相似问题