如何在 Eclipse Juno/Kepler/Luna CDT 中启用 C++11?
Posted
技术标签:
【中文标题】如何在 Eclipse Juno/Kepler/Luna CDT 中启用 C++11?【英文标题】:How to enable C++11 in Eclipse Juno/Kepler/Luna CDT? 【发布时间】:2013-07-01 16:17:40 【问题描述】:编辑:事实证明,这并不是 Eclipse Kepler 特有的。我不得不对 Eclipse Juno 使用相同的过程。问题是在回答同样问题的其他帖子中似乎缺少步骤。
我正在为 C++ 使用 Eclipse Kepler,我正在尝试使用 C++11 并遇到错误。编译时出现错误
错误:C++98 模式下不允许基于范围的 for 循环
我已按照帖子中的说明进行操作
Eclipse CDT C++11/C++0x support
并且为 Eclipse Juno 提供的解决方案不起作用。
不同的 cmets 建议重新启动 eclipse 并清理和重建。这并没有什么不同。
【问题讨论】:
【参考方案1】:您需要做两件事,首先需要设置编译器,然后需要设置 CDT 的语言处理器。由于您没有提及您使用的编译器,我假设它是 GCC,但其他编译器的步骤将类似。 (请注意,您当然需要支持 C++11 的编译器。)
设置编译器相当简单:
-
右键单击您的项目,然后单击属性
在 C/C++ 构建下单击设置
在 GCC C++ 编译器下,单击杂项
在“其他标志”框中,将“-std=c++11”附加到标记列表中。
点击应用和确定
此时,您应该能够重建项目并使其运行。但是 CDT 仍然可能显示 C++11 包含的错误。以下是解决该问题的方法:
-
右键单击您的项目,然后单击属性
在 C/C++ 常规下单击“预处理器包含路径、宏”
选择提供者选项卡
列表中应该有一个项目,上面写着“GCC 内置编译器设置”。选择此条目。
取消选中“使用全局提供程序...”选项
在列表下方有一个框,上面写着“获取编译器规范的命令”。在此附加“-std=c++0x”。
使用右侧的“上移”按钮将“GCC 内置编译器设置”提供程序移至列表顶部。
单击应用,然后单击确定。
返回 Eclipse 工作区,选择项目菜单、C/C++ 索引,然后单击“重新解析未解析的包含”。
【讨论】:
谢谢。这行得通。也许我误读了我链接到的另一篇文章,但似乎在那篇文章中没有提到设置编译器。 对我不起作用。我的主要问题是未解决的 c++11 包含。我把-std=c++11
放在你说的地方,并重建了完整的索引,仍然显示一堆无法识别的 std::cout、std::set 等......
编辑:我没有找到它应该的第一部分,但我正在通过 make 编译,所以它可能是一个解释。 (虽然我在工作区配置中找到了它并进行了设置)。但是我把它放在compiler spec
,还是不行。 std::shared_ptr 和相同的无法识别。虽然它曾经在 Juno 的旧机器上工作。
在我的情况下(gcc),我使用了 -std=c++0x。所以一切正常。谢谢!
@MrEricSir 有没有办法为工作区进行此设置,以便当我添加一个新项目时它也会自动应用到它?【参考方案2】:
Eclipse Kepler Service Release 1 中的 C++11 支持(内部版本 ID:20130919-0819)
在最新版本的 Eclipse Kepler SR1 中,您只需添加 -std=c++11
-
右键单击您的项目,然后单击属性
导航到 C/C++ General 和 预处理器包括路径、宏等
选择提供者标签
将 -std=c++11 添加到命令以获取编译器规格:
应用更改,索引应该会自动生成。
“获取编译器规格的命令:”-行应如下所示:
$COMMAND -E -P -v -dD "$INPUTS" -std=c++11
【讨论】:
使用 GCC 我必须添加 -std=c++0x 您使用哪种 GCC? c++0X 是 C++11 的旧名称(别名) 发现这是第二次设置新的 eclipse CDT - 设置应该更直观。【参考方案3】:从 CDT 8.3 (available as a Kepler update) 开始,构建设置中有一个新的方言选项:
http://wiki.eclipse.org/CDT/User/NewIn83#Build
【讨论】:
【参考方案4】:我使用 Eclipse Kepler 并修复它,我这样做了:
1 - 右键单击项目 >> 属性 >> C/C++ 构建 :: 设置
2 - 转到 GCC G++ 编译器 >> 杂项 >> 其他标志
i then added -std=c++11
hit apply and ok
这解决了我的问题!
希望对你有帮助!
【讨论】:
这是 Eclipse 平台的最佳答案,版本:4.3.1 - 不知道 Kepler/Juno 是什么! Eclipse Kepler 是 Eclipse 版本 4.3.X【参考方案5】:在这里运行 eclipse indigo 和 cdt 8.0.2。我遵循了所有指南,但仍然需要手动设置预处理器定义以查找 std::unique_ptr 之类的内容。 包含文件“内存”检查这一点。 在项目属性的“C++ 常规”中的“路径和符号”下的“符号”选项卡上将 __cplusplus 设置为 201103L。
【讨论】:
是的,适用于从旧项目迁移。【参考方案6】:将方言标志“-std=c++11”添加到项目属性-> C/C++ Build -> Settings -> Tool settings (GCC C++ Compiler -> Dialect) 解决了我在 Eclipse Kepler 中的问题,除了设置如上所述。
【讨论】:
【参考方案7】:我使用的是 Eclipse Luna,在 C/C++ Build -> Settings 下没有“工具设置”。我DID按照建议将 -std=c++11 添加到“C/C++ General -> Preprocessor Includes -> Providers”下的编译器规范命令行。但这仍然不能满足我的索引器解析 emplace() 的能力。
于是我查看了头文件,发现 emplace 函数依赖于 __cplusplus >= 201103L。所以我只是添加了预处理器符号“__cplusplus”并将其值设为 201103。
有点骇人听闻,但索引器很高兴。 (并且 makefile 定义了我的构建标志,而不是 eclipse 项目)
【讨论】:
【参考方案8】:MrEricSir 提供的解决方案只有在安装了最新的 Eclipse Oxygen CDT 后才能工作。 Mars CDT 不适用于我。
【讨论】:
以上是关于如何在 Eclipse Juno/Kepler/Luna CDT 中启用 C++11?的主要内容,如果未能解决你的问题,请参考以下文章