如何在Eclipse CDT中启用C++11/C++0x支持?

218

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2

这是一段C++11代码的示例:

auto text = std::unique_ptr<char[]>(new char[len]);
Eclipse编辑器提示以下内容:
Function 'unique_ptr' could not be resolved

Makefile编译运行正常,如何让Eclipse停止抱怨这类错误?


12
至少应该使用 std::unique_ptr<char[]> - Cubbi
1
unique_ptr<char> 不会调用 delete,因为它是通过 new[] 创建的,这是错误的吗? - Dietrich Epp
7
@Nick: 不,他是正确的。你写的方式会调用 delete,但你需要调用 delete[]unique_ptr<char> 假设它得到的是一个指针,会使用 delete 进行删除。而 unique_ptr<char[]> 则期望一个数组,并使用 delete[] 正确地进行删除。 - Nicol Bolas
相关链接:https://dev59.com/i1_Va4cB1Zd3GeqPSVr_,https://dev59.com/z2oy5IYBdhLWcg3wHabt,http://stackoverflow.com/q/8564544/636019,https://dev59.com/PWsy5IYBdhLWcg3wzBF4 - ildjarn
评论者们,请了解语法。unique_ptr<char[]>是一种新的语法,用于调用delete[]。 - CashCow
显示剩余3条评论
17个回答

232

我在Eclipse论坛上找到了这篇文章,按照步骤操作后,它对我来说有效果。我正在Windows上使用带有Cygwin配置的Eclipse Indigo 20110615-0604。

  • 创建一个新的C++项目
  • 默认选择所有选项
  • 创建后,右键单击该项目并转到“属性”
  • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags。在末尾输入-std=c++0x(或者对于更新的编译器版本, 输入 -std=c++11),而不是GCC C++ Compiler,我也有Cygwin编译器
  • C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. 点击“添加...”,将__GXX_EXPERIMENTAL_CXX0X__(确保前后都有两个下划线)粘贴到“名称”中,并将“值”留空。
  • 点击应用,然后根据提示进行操作,最后点击确定。

现在在Eclipse FAQ中也有关于此问题的描述:Eclipse FAQ/C++11 Features

Eclipse设置

Eclipse image setting


2
耶,它起作用了!但是,请确保在GXX_EXPERIMENTAL_CXX0X前后添加两个下划线 - 在此期间我将接受这个。 - Nick
5
这是否解决了虚假的编辑器错误?我编译没有问题,并且新的标准类型被识别,但我无法摆脱基于范围的for循环和rvalue引用“&&”的编辑器语法错误。 - juanchopanza
8
现在自然而然的后续问题是:我们是否可以通过将这些特定的C++项目设置保存到新的Eclipse项目模板中,比如“C++11项目”,来优化我们的工作流程? - Nordlöw
39
注意:对于任何寻找Juno答案的人,这个方法是_无效的_。 - Christopher
4
对于Kepler/Juno,解决方案可以在此答案中找到。它是作为对Johan Lundberg回复的编辑发布的,但我也在这里注明,以使得被接受的答案更加完整。 - Inusable Lumière
显示剩余14条评论

153

Eclipse CDT 4.4 Luna和4.5 Mars 的指令

首先,在创建项目之前,请配置Eclipse语法分析器:

窗口 -> 首选项 -> C/C++ -> 构建 -> 设置 -> 发现 -> CDT GCC内置编译器设置

在名为命令获取编译器规范的文本框中追加-std=c++11

现在可以创建项目,配置取决于您创建的项目类型:

对于作为以下内容创建的项目: 文件->新建->项目->C/C++->C++项目

右键单击所创建的项目并打开

属性 -> C/C++构建 -> 设置 -> 工具设置 -> GCC C++编译器 -> 方言

-std=c++11放入名为其他方言标志的文本框中,或从语言标准下拉菜单中选择ISO C++11

对于CMake项目

生成Eclipse项目文件(在您的项目内部)

mkdir build
cd build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ..

然后将生成的目录作为标准Eclipse项目导入Eclipse。右键单击项目并打开

属性 -> C/C++通用 -> 预处理器包含路径,宏等 -> 提供程序

启用CDT GCC内置编译器设置并将其移动到Contributed PathEntry Containers之上(这很重要)

最后一步

重新编译、再生成项目 -> C/C++索引,然后重启Eclipse。


1
完美运行,甚至无需重启 Eclipse。谢谢。 - prasannak
谢谢。在Luna上,其他答案对我都没有用。 - Mohamed ElNakeep
谢谢!这是我遇到的问题中最有帮助的答案(4.5)。 - AturSams
感谢使用autotools项目,第一步解决了问题。 - Jichao
2
对于Eclipse Neon.3,使用C++ Makefile项目,将-std=c++11添加到项目设置中的位置是:Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers [tab] -> CDT GCC Built-in Compiler Settings -> Command used to get compiler specs:。在该位置追加-std=c++11即可。我曾经按照建议在全局工作区设置中进行了设置,但是当我创建一个新的Makefile项目时,它并没有被复制到上述位置。 - BeeOnRope
显示剩余5条评论

112

更新于2016年:

gcc 6 (更改)开始,默认的C ++方言是C++14。这意味着,除非你明确需要比此更新或较旧的方言,否则无需再使用eclipse进行任何操作。

对于Luna和Mars:

此社区wiki部分包含Trismegistos的答案;

1.在创建项目之前,请配置Eclipse语法解析器:

Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings

在标题为“Command to get compiler specs”的文本框中附加-std=c++14

2.创建项目,配置取决于您创建的项目类型:

对于作为项目创建的文件:File -> New -> Project -> C/C++ -> C++ Project

右键单击创建的项目并打开

属性 -> C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Dialect

-std=c++14放入其他方言标志文本框中,或从Language standard下拉菜单中选择ISO C++11。

现在有一种新的方法可以解决这个问题,而不需要GXX_EXPERIMENTAL hack。

对于最新版本:(目前为Juno和KeplerLuna):

在Juno的较新版本下,设置位于项目属性 -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ()

旧版2012/2013:

  1. 在C/C++构建(项目设置中),找到预处理器包含路径,进入提供程序选项卡。取消选择除CDT GCC内置编译器设置之外的所有选项。然后取消共享设置条目... 在命令文本框中添加选项-std=c++11以获取编译器规范。

  2. 转到路径和符号。在符号下,点击恢复默认值,然后应用。


  3. 注意事项:

    Eclipse对于应用非常挑剔,每次离开设置标签时都需要进行应用操作。

    [自我推广]: 我基于以上内容撰写了自己更为详细的说明。 http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

    感谢https://dev59.com/0GYr5IYBdhLWcg3wfaMA#13635080的用户Nobody


3
谢谢你,但这并没有帮助我解决C++11引用的问题。程序编译正确,但eclipse无法解析它们。当我检查"array"时,#ifndef __GXX_EXPERIMENTAL_CXX0X__返回true,并且其下方的代码未被解析。当我将__GXX_EXPERIMENTAL_CXX0X__添加到项目符号中时,数组得到了解析,但我的项目的引用出现了混乱。这里可能有什么问题? - Halil
1
我认为这是一个bug。我按照以下步骤重现了它:打开新项目。启用c++11功能。添加一个带有公共变量的随机类。创建该随机类的向量。获取迭代器。尝试访问公共变量。要么我的工作空间已损坏,要么Eclipse存在无法解析此内容的bug。 - Halil
1
@HalilKaskavalci 我发现了同样的 bug。如果我设置编辑器为 c++11,那么迭代器无法解析。如果我不这样做,std::unique_ptr 就无法解析。真的很烦人,因为我两个都用到了。 - Kian
1
@Kian 我已经报告了这个错误。https://bugs.eclipse.org/bugs/show_bug.cgi?id=397027。它非常令人烦恼,所以我开始使用boost库,它们不会产生这个错误 :) - Halil
1
@JohanLundberg,对我来说没有丢失任何步骤。事实上,在详细说明中甚至有一个额外的步骤(根据OP所述的目的)。因此,基本上它是-std=c++11标志和恢复默认值。 - Vladislav Ivanishin
显示剩余12条评论

20
针对最新的(Juno) Eclipse CDT,以下内容适用于我,无需自行声明__GXX_EXPERIMENTAL_CXX0X__。 这适用于CDT索引器和编译器参数:
“您的项目名称”->右键单击->属性:
C/C++常规 -> 预处理器包含路径、宏等 -> 切换到名为“Providers”的选项卡:
- 对于“Configuration”,选择“Release”(然后是“debug”) - 关闭所有提供程序,只选择“CDT GCC内置编译器设置” - 取消选中“在项目之间共享设置条目(全局提供程序)” - 在“获取编译器规格的命令:”中添加“-std=c++11”(不带引号)(也可以使用引号) - 单击应用并关闭选项 - 重新构建索引
现在,索引器应该正确解析所有与c++11相关的内容。
win7 x64,最新的官方Eclipse CDT,从sourceforge的mingwbuilds项目下载mingw-w64 gcc 4.7.2

仍然收到相同的错误编辑器警告,例如“无法解析类型'std::thread'”,尽管它可以编译和执行正常。 - Scott Stensland
2
你需要使用新设置编译一次,这样解析器才能“学习”std=c++11标志已经设置。 - Andreas
根据编译器版本的不同,可能需要添加-std=c++0x而不是-std=c++11(例如Debian Wheezy)。 - xmoex

15

我在Eclipse Juno上也遇到了同样的问题。按照以下步骤解决:

  • 进入项目 -> 属性 -> C/C++常规 -> 路径和符号 -> 标签[符号]
  • 添加符号:__cplusplus,值为201103L

2
这应该是被接受的答案,因为它也适用于Makefile项目! - omikron
@Jerk31,这对于在Windows上运行的Eclipse Juno(对我来说)不起作用,我仍然看到那些抱怨的不必要的错误,尽管二进制文件运行良好。请帮帮我!!! - overexchange
非常抱歉,我无法在Windows上为您提供帮助,因为我没有机会尝试在该操作系统上执行任何C++项目。祝您一切顺利! - Jerome
我会避免使用这个解决方案,因为它会覆盖编译器定义的内容。话虽如此,由于我在Ubuntu上的Eclipse 2021无法使用-std选项,所以我即将采用这种方法。 - David Bradley

14

针对Eclipse CDT Kepler,我成功消除了std::thread未解决的符号,方法如下:

  1. 进入偏好设置->C/C++->构建->设置

  2. 选择“发现”选项卡

  3. 选择CDT GCC内置编译器设置[共享]

  4. 将-std=c++11添加到“获取编译器规范的命令:”字段中,如下所示:

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

  1. 确定并重新构建项目索引。

对于Kepler,将-std=c++11添加到项目属性/C/C++构建->设置->工具设置->GCC C++编译器->杂项->其他标志并不足够,但对于较旧的版本,如Helios则足够了。


对于Eclipse版本:2019-09 R。 这个解决方案对我有效,但在此之前我花费了很多时间。问题出在构建器设置上: 项目 -> 属性 -> C/C++构建:在“构建器设置”选项卡中选择“内部构建器”作为“构建器类型”。 - grekhss

5

我还不能发表评论,所以我写了自己的答案:

这与__GXX_EXPERIMENTAL_CXX0X__有关,适用于Eclipse Juno和CDT 8.x。

这个答案的一些部分已经在其他答案中涉及,但我希望它更连贯。

为了使stdc++11编译成可能,必须为编译器添加特定的标志。您可以通过项目属性来完成。要修改项目属性,请单击RMBProject propertiesALT + ENTER。然后C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags。在行尾加上-std=c++11,对于GCC它看起来应该是这样的:-c -fmessage-length=0 -std=c++11。通过添加-stdc++11标志,编译器(GCC)将自动声明__GXX_EXPERIMENTAL_CXX0X__

此时,您可以使用C++11的所有好处来构建项目。

问题在于,Eclipse具有自己的解析器以检查错误——这就是为什么您在Eclipse编辑器中仍然会得到所有讨厌的错误,而同时您可以在没有任何错误的情况下构建和运行项目。有一种方法可以通过显式声明项目的__GXX_EXPERIMENTAL_CXX0X__标志来解决这个问题,您可以这样做(就像Carsten Greiner所说的那样): C/C++ General -> Paths and Symbols -> Symbols -> GNU C++。单击“添加...”,并将__GXX_EXPERIMENTAL_CXX0X__(确保在名称前后加上两个下划线)粘贴到“名称”中,并将“值”留空。 现在是我想在对第一个答案进行评论时涵盖的额外部分,转到: C/C++ General -> Preprocessor Include Path Macros etc. -> Providers,选择CDT Managed Build Setting Entries,然后单击APPLY并返回Entries选项卡,在GNU C++下应该现在有CDT Managed Build Setting Entries,请检查其中是否定义了__GXX_EXPERIMENTAL_CXX0X__如果是-> APPLY并重建索引,此时您应该没问题了。


3

我也遇到了几个问题(Ubuntu 13.04 64位、g++-4.8、eclipse Juno 3.8.1、CDT 6.0.0)。上面提到了很多事情,抱歉重复了一些,但是我还遇到了利用的问题。

std::thread

作为c++11的一部分(添加-pthread到链接器即可解决此问题)。无论如何,最终这些设置都有效了:
项目->属性->C/C++构建->设置->杂项。添加以下内容:
-std=c++11

为GCC和G++编译器添加标志。 点击应用。

对于链接器,同一窗口,杂项,链接器标志,添加了以下内容

-pthread

标志。共享库设置,共享对象名称,添加

-Wl,--no-as-needed

同时也要标记。点击应用。

C/C++常规 -> 路径和符号 -> 符号标签页,选择GNU C++,添加

__GXX_EXPERIMENTAL_CXX0X__

(没有数值)

标志。 点击应用。

C / C ++通用 -> 预处理器包括路径.. -> 提供程序选项卡:勾选

CDT GCC内置编译器设置

"获取编译器规格的命令",添加

-std=c++11

标记。取消勾选共享选项,点击应用。

CDT 管理构建设置条目,也要勾选此项。取消勾选其他两个选项,点击应用。

返回到条目选项卡,GNU C++ CDT 管理构建设置条目,您现在应该可以看到您添加的内容了。

__GXX_EXPERIMENTAL_CXX0X__

入口。

就是这样。在编写代码时,输入

std::

现在可以自动完成实例的线程类,构建应该正常运行,不应该有任何问题。
std::system_error'what(): Enable multithreading to use std::thread: Operation not permitted

在运行时。

项目-> 属性-> C/C++ 构建-> 设置-> 杂项 步骤对我有用。谢谢 :D - Jake88

2
Eclipse C/C++无法识别符号std::unique_ptr,即使您已在文件中包含了C++11内存头文件。假设您正在使用GNU C++编译器,以下是我解决问题的方法:
项目 -> 属性 -> C/C++常规 -> 预处理器包含路径 -> GNU C++ -> CDT用户设置条目
  1. Click on the "Add..." button

  2. Select "Preprocessor Macro" from the dropdown menu

    Name: __cplusplus     Value:  201103L
    
  3. Hit Apply, and then OK to go back to your project

  4. Then rebuild you C++ index: Projects -> C/C++ Index -> Rebuild


这是我在Eclipse 2018-12中唯一有效的方法。 "被接受"的答案等在2018-12中已经不再适用。 - David Steinhauer

2
我不知道是否只有我遇到了这个问题,最高排名的解决方案对我没有用,我的eclipse版本是在Ubuntu中使用sudo apt-get install eclipse安装的普通eclipse平台。但是我发现了一种解决方法,它采用了最高排名解决方案和第二种解决方案的方法,下面描述了我使其工作的步骤(注意,为了简单起见,忽略了创建C++项目等其他步骤)。
一旦你创建了C++项目:
(1)C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. 点击“添加...”,并将GXX_EXPERIMENTAL_CXX0X(确保在名称前后添加两个下划线)粘贴到“名称”中,而“值”则留空。
(2)在C/C++ Build(项目设置中),找到预处理器包含路径并转到提供程序选项卡。取消选择除CDT GCC内置编译器设置之外的所有选项。然后取消标记共享设置条目……。在称为Command的文本框中添加选项-std=c++11以获取编译器规范。
执行上述仅有的两个步骤后,它就可以正常工作了,eclipse能够解析unique_ptr,我不知道为什么这个解决方案有效,希望它能帮助人们。

这对我也起作用了(eclipse neon)。起初,我没有取消选择其他提供者,这仍然会导致问题,但是除了“CDT GCC内置编译器设置”和“CDT用户设置”之外取消选择所有其他提供者就可以了。谢谢! - zpon

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