如何在Eclipse Juno/Kepler/Luna CDT中启用C++11?

85

编辑:事实证明这并不仅适用于Eclipse Kepler。我必须使用相同的过程来处理Eclipse Juno。问题在于其他回答此问题的帖子中似乎缺少一些步骤。

我正在使用C ++的Eclipse Kepler,尝试使用C ++ 11并出现错误。编译时出现错误

错误:在C ++ 98模式下不允许使用基于范围的for循环

我已经按照这篇文章中的说明进行了操作

Eclipse CDT C++11/C++0x支持

但是给出的解决方案对Eclipse Juno无效。

不同的评论建议重新启动eclipse并清理和重建。但这也没有产生任何差异。

8个回答

182

你需要做两件事情,首先你需要设置你的编译器,然后你需要设置CDT的语言处理器。由于你没有提到你使用哪个编译器,我会假设它是GCC,但其他编译器的步骤也类似。(当然,你需要一个支持C++11的编译器。)

设置编译器非常简单:

  1. 右键单击你的项目并点击属性
  2. 在C/C++构建下点击设置(Setings)
  3. 在GCC C++编译器下,点击杂项(Miscellaneous)
  4. 在其他标志框中,把"-std=c++11"添加到标记列表中。
  5. 点击应用(Apply)和确定(OK)

此时,你应该能够重建你的项目并使其运行。但CDT仍可能显示C++11 include的错误。以下是如何解决这个问题:

  1. 右键单击你的项目并点击属性(Properties)
  2. 在C/C++通用下点击"预处理器包含路径、宏"(Preprocessor Include Paths, Macros)
  3. 选择提供者(Providers)选项卡
  4. 列表中应该有一项类似于“GCC内置编译器设置”的条目。选择此条目。
  5. 取消选中"使用全局提供者..."选项(Uncheck the "Use global provider..." option)
  6. 在列表下方有一个框,上面写着"获取编译器规格的命令(Command to get compiler specs.)"。在此处添加"-std=c++0x"。
  7. 使用右侧的"向上移动(Move Up)"按钮将“GCC内置编译器设置”提供者移到列表顶部。
  8. 单击应用(Apply),然后单击确定(OK)。
  9. 回到你的Eclipse工作区,选择Project菜单、C/C++ Index,然后点击"重新解析未解决的包含文件(Re-resolve unresolved includes)"。

1
谢谢。这个方法可行。也许我误读了我链接的另一篇帖子,但似乎那篇帖子中没有提到设置编译器。 - user327301
1
对我没用。我的主要问题是未解决的c++11包含文件。我按照你说的放置了“-std=c++11”,并重新构建了完整的索引,但仍然显示大量无法识别的std::cout、std::set等…… - Dolanor
2
编辑:我没有在应该的地方找到第一部分,但我正在通过make进行编译,所以这可能是一个解释。(不过我在工作区配置中找到了它并设置了它)。但我把它放在“编译器规范”中,仍然不起作用。std::shared_ptr和same未被识别。虽然在旧机器上使用juno时它曾经可以工作。 - Dolanor
1
在我的情况下(gcc),我使用了-std=c++0x。所以一切都正常工作。谢谢! - Denis Zaikin
4
@MrEricSir 有没有办法将这个设置应用到工作区,这样当我添加一个新项目时它就会自动应用呢? - Ivaylo Strandjev
显示剩余7条评论

25

Eclipse Kepler Service Release 1 (Build id: 20130919-0819) 支持 C++11。

在最新版本的 Eclipse Kepler SR1 中,您只需要添加 -std=c++11

  1. 右键单击项目,然后单击属性
  2. 导航到 C/C++通用预处理器包含路径、宏等
  3. 选择 提供程序 选项卡。
  4. -std=c++11 添加到 获取编译器规范的命令: 中。
  5. 应用更改,索引应该会自动生成。

"获取编译器规范的命令:" 行应该是这样的:

${COMMAND} -E -P -v -dD "${INPUTS}" -std=c++11

2
使用GCC编译器时,我需要添加 -std=c++0x 参数。 - ccook
你使用哪个GCC?c++0X是C++11的旧名称(别名)。 - MeJ
1
第二次安装全新的Eclipse CDT时又发现了这个问题 - 应该更加直观地设置。 - ccook

13

6

我使用的是Eclipse Kepler,为了解决这个问题,我做了以下操作:

1 - 右键单击项目 >> 属性 >> C/C++ Build :: 设置

2 - 转到GCC G++编译器 >> 杂项 >> 其他标志

然后我添加了-std=c++11,点击应用和确定

这样就解决了我的问题!

希望对你有所帮助!


这是Eclipse平台4.3.1版本的最佳答案 - 不知道Kepler/Juno是什么! - TCSGrad
Eclipse Kepler 是 Eclipse 4.3.X 版本。 - Karrq

4

我这里运行的是eclipse indigo和cdt 8.0.2。我按照所有指南进行了操作,但仍然需要手动设置预处理器定义才能找到像std::unique_ptr这样的东西。 包含文件“memory”会检查这一点。 在项目属性中的“C++ General”下的“Paths and Symbols”中的“Symbols”选项卡上将__cplusplus设置为201103L。


是的,适用于从旧项目迁移。 - Guy L

2

在Eclipse Kepler中,将方言标志“-std=c++11”添加到项目属性-> C / C ++ Build -> Settings -> Tool settings(GCC C ++编译器 -> Dialect)中解决了我的问题,除了上述设置。


1
我正在使用Eclipse Luna,但在C/C++ Build -> Settings下找不到“Tool Settings”。如建议所述,在“C/C++ General -> Preprocessor Includes -> Providers”下的编译器规范命令行中添加了“-std=c++11”,但这仍然无法满足我的索引程序解析emplace()函数的能力。
因此,我查看了头文件,发现emplace函数依赖于__cplusplus >= 201103L。所以我只需添加预处理器符号“__cplusplus”,并给它赋值201103即可。
有点hackish,但索引程序很高兴。(而makefile定义了我的构建标志,而不是eclipse项目)

0
MrEricSir 提供的解决方案只适用于安装了最新的 Eclipse Oxygen CDT。对于 Mars CDT,它对我来说不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接