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

时间:2012-02-03 16:13:58

标签: c++ eclipse c++11 eclipse-cdt

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停止抱怨这些错误?

16 个答案:

答案 0 :(得分:220)

我在Eclipse论坛中找到了this文章,只是遵循了这些步骤,它对我有用。我在Windows上使用Eclipse Indigo 20110615-0604并使用Cygwin设置。

  • 制作新的C ++项目
  • 所有内容的默认选项
  • 创建后,右键单击项目并转到“属性”
  • C / C ++ Build - &gt;设置 - &gt;工具设置 - &gt; GCC C ++编译器 - &gt;其他 - &gt;其他旗帜。把-std=c++0x(或者更新的编译器版本-std=c++11放在最后....而不是GCC C ++编译器我也有Cygwin编译器
  • C / C ++ General - &gt;路径和符号 - &gt;符号 - &gt; GNU C ++。点击“添加...”并粘贴__GXX_EXPERIMENTAL_CXX0X__(确保将两个下划线附加并添加前缀)到“名称”中,并将“值”留空。
  • 点击Apply,做任何要求你做的事,然后按OK。

现在还在Eclipse FAQ中对此进行了描述:Eclipse FAQ/C++11 Features

Eclipse image setting

答案 1 :(得分:146)

Eclipse CDT 4.4 Luna和4.5 Mars的说明

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

Window - &gt; Preferences - &gt; C/C++ - &gt; Build - &gt; Settings - &gt; Discovery - &gt; CDT GCC Build-in Compiler Settings

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

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

对于创建的项目:文件 - &gt;新 - &gt;项目 - &gt; C / C ++ - &gt; C ++项目

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

Properties - &gt; C/C++ Build - &gt; Settings - &gt; Tool Settings - &gt; GCC C++ Compiler - &gt; Dialect

-std=c++11放入标题为other dialect flags的文本框中,或从ISO C++11下拉菜单中选择Language standard

适用于CMake项目

生成eclipse项目文件(在项目中)

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

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

Properties - &gt; C/C++ General - &gt; Preprocessor Include Paths, Marcos etc. - &gt; Providers

启用CDT GCC Build-in Compiler Settings并将其移至高于Contributed PathEntry Containers(这很重要)

最后一步

重新编译,重新生成Project - &gt; C/C++ Index并重启Eclipse。

答案 2 :(得分:110)

2016年更新:

gcc 6changes)开始,默认的C ++方言是C ++ 14。这意味着除非你明确需要一个比那个更新或更旧的方言,否则你不再需要用eclipse做任何事了。

对于月神和火星

这个社区维基部分包含了Trismegistos的答案;

<强> 1。在创建项目之前,请配置Eclipse语法分析器:

窗口 - &gt;偏好 - &gt; C / C ++ - &gt;构建 - &gt;设置 - &gt;发现 - &gt; CDT GCC内置编译器设置

在标题为Command to get to get compiler specs append -std=c++14的文本框中  的 2。创建项目,配置取决于您创建的项目类型:

对于创建的项目:文件 - &gt;新 - &gt;项目 - &gt; C / C ++ - &gt; C ++项目

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

属性 - &gt; C / C ++ Build - &gt;设置 - &gt;工具设置 - &gt; GCC C ++编译器 - &gt;方言

-std=c++14放入标题为其他方言标记的文本框中,或从语言标准下拉列表中选择ISO C ++ 11。

现在有一种新方法可以在没有GXX_EXPERIMENTAL黑客的情况下解决这个问题。

对于最新版本 :(目前 Juno和Kepler Luna ):

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

旧版本2012/2013:

  1. 在C / C ++ Build下(在项目设置下),找到预处理器包含路径,然后转到提供商标签。取消选择除CDT GCC内置编译器设置之外的所有内容。然后取消标记共享设置条目.... 将选项-std = c ++ 11 添加到名为Command的文本框中以获取编译器规范。

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


  3. 注意:

    Eclipse对于点击应用很挑剔,每次离开设置选项卡时都需要这样做。

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

    感谢https://stackoverflow.com/a/13635080/1149664

    用户Nobody

答案 3 :(得分:15)

我的Eclipse Juno遇到了同样的问题。这些步骤解决了这个问题:

  • 转到Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols]
  • 使用值 201103L
  • 添加符号 __ cplusplus

答案 4 :(得分:11)

对于Eclipse CDT开普勒,对我来说,摆脱std::thread未解决的符号是:

  1. 转到首选项 - &gt; C / C ++ - &gt;构建 - &gt;设置

  2. 选择“发现”标签

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

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

  5.   

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

    1. Ok和项目的重建索引。
    2. -std=c++11添加到项目Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other 对于开普勒而言,旗帜还不够,但对于像Helios这样的旧版本来说已经足够了。

答案 5 :(得分:5)

我还不能评论所以我正在写自己的答案:

它与__GXX_EXPERIMENTAL_CXX0X__有关,它对Eclipse Juno和CDT 8.x有效。

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

为了能够使用stdc ++ 11进行构建,必须为编译器添加特定的标志。您可以通过项目属性执行此操作。修改项目属性RMBProject propertiesALT + ENTER。然后是C / C ++ Build - &gt;设置 - &gt;工具设置 - &gt; GCC C ++编译器 - &gt;其他 - &gt;其他旗帜。将-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 ++一般 - &gt;路径和符号 - &gt;符号 - &gt; GNU C ++。单击“添加...”并过去__GXX_EXPERIMENTAL_CXX0X__(确保将两个下划线附加并添加前缀)到“名称”中,并将“值”留空。 现在是我想在第一个答案的评论中涵盖的额外部分,请访问: C / C ++一般 - &gt;预处理器包括路径宏等 - &gt;提供者,然后选择CDT Managed Build Setting Entries,然后单击“应用”并返回“条目”选项卡,在GNU C ++下,现在应该有CDT托管构建设置条目,检查是否在内部定义了__GXX_EXPERIMENTAL_CXX0X__,如果是 - >申请和重建索引你现在应该没事。

答案 6 :(得分:3)

我也有几个问题(Ubuntu 13.04 64位,g ++ - 4.8,eclipse Juno 3.8.1,CDT 6.0.0)。上面提到了很多东西,抱歉重复这些,但另外我在使用

时遇到了问题
std::thread

作为c ++ 11的一部分(为链接器添加-pthread解决了这个问题)。无论如何,最后这些设置运行良好:

项目 - &gt;属性 - &gt; C / C ++ Build - &gt;设置 - &gt;杂。添加

-std=c++11
GCC和G ++编译器的

标志。单击“应用”。

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

-pthread

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

-Wl,--no-as-needed

也是旗帜。单击“应用”。

C / C ++ General - &gt;路径和符号 - &gt;选中符号TAB,GNU C ++,添加

__GXX_EXPERIMENTAL_CXX0X__

(没有价值)

标记。单击“应用”。

C / C ++ General - &gt;预处理器包含路径.. - &gt;提供商标签:检查

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

在运行时。

答案 7 :(得分:2)

我不知道是否只有我,排名最高的解决方案对我不起作用,我的eclipse版本只是在Ubuntu中使用sudo apt-get install eclipse安装的普通eclipse平台 但是我找到了一个解决方案,从排名最高的解决方案和第二个解决方案一起采用方法,我所做的工作如下所述(注意,为简单起见,忽略了创建C ++项目等其他步骤)

创建C ++项目后

(1)C / C ++ General - &gt;路径和符号 - &gt;符号 - &gt; GNU C ++。点击“添加...”并粘贴 GXX_EXPERIMENTAL_CXX0X (确保将两个下划线附加并添加前缀)到“名称”中,并将“值”留空。

(2)在C / C ++ Build下(在项目设置下),找到Preprocessor Include Path并转到Providers选项卡。取消选择除CDT GCC内置编译器设置之外的所有内容。然后取消标记共享设置条目....将选项-std = c ++ 11添加到名为Command的文本框中以获取编译器规范

执行了上面2和2之后的步骤,它的工作原理,eclipse能够解析unique_ptr,我不知道为什么这个解决方案有效,希望它可以帮助人们。

答案 8 :(得分:2)

即使您在文件中包含了C ++ 11内存标头,Eclipse C / C ++也无法识别符号std::unique_ptr

假设您正在使用GNU C ++编译器,这就是我要解决的问题:

项目 - &gt;属性 - &gt; C / C ++一般 - &gt;预处理器包含路径 - &gt; GNU C ++ - &gt; CDT用户设置条目

  1. 点击&#34;添加...&#34;按钮

  2. 选择&#34;预处理器宏&#34;从下拉菜单中

    Name: __cplusplus     Value:  201103L
    
  3. 点击Apply,然后按OK返回项目

  4. 然后重建C ++索引:Projects - &gt; C / C ++索引 - &gt;重建

答案 9 :(得分:1)

对我来说 Eclipse Neon 我跟着Trismegistos answer here above,我还添加了一个额外的步骤:

  • 转到项目 - &gt;属性 - &gt; C ++ General - &gt;预处理器包括路径,宏等 - &gt;提供商 - &gt; CDT Cross GCC内置编译器设置,附加标志 &#34; -std = c ++ 11&#34;

点击申请,然后确定。

干杯,

盖。

答案 10 :(得分:0)

  • 右键单击项目并转到“属性”
  • C / C ++ Build - &gt;设置 - &gt;工具设置 - &gt; GCC C ++编译器 - &gt;其他 - &gt;其他旗帜。将-lm放在其他标志文本框的末尾,然后单击确定。

答案 11 :(得分:0)

黑客和清洁版都不适用于Indigo。黑客被忽略,并且缺少必需的配置选项。由于没有明显的原因,构建在不工作之后开始工作,并没有提供任何有用的理由。至少从命令行,我得到了可重现的结果。

答案 12 :(得分:0)

要在Eclipse Luna中获得对C ++ 14的支持,您可以执行以下步骤:

  • C++ General -> Preprocessor Include -> Providers -> CDT Cross GCC Built-in Compiler Settings中,添加“-std = c ++ 14”
  • C++ Build -> Settings -> Cross G++ Compiler -> Miscellaneous中,添加“-std = c ++ 14”

重新编译项目并最终重启Eclipse。它应该按预期工作。

答案 13 :(得分:0)

我在Mac上以这种方式解决了这个问题。我用Homebrew安装了最新版本的gcc / g ++。它们位于/ usr / local / bin中,包含在/ usr / local / include中。

我将CD加入/ usr / local / bin并从g ++ @ 7创建一个符号链接,只是因为g ++导致@ bit烦人。

然后我去了MyProject - &gt;属性 - &gt; C / C ++ Build - &gt;设置 - &gt; GCC C ++编译器并将命令从“g ++”更改为“/ usr / local / bin / g ++”。如果您决定不进行符号链接,则可以更具体。

为链接器执行相同的操作。

申请并申请并关闭。让它重建索引。有一段时间,它显示了令人畏惧的错误数量,但我认为这是在构建索引时。当我弄清楚错误的时候,他们都没有采取进一步行动就消失了。

我认为没有验证你也可以进入Eclipse - &gt;属性 - &gt; C / C ++ - &gt;核心构建工具链并编辑具有不同路径的工具链,但我不确定它会做什么。

答案 14 :(得分:0)

对于使用std :: optional和std :: swap的混合C和C ++项目,我使用Eclipse C ++ 2019-03遇到类似的问题。对我有用的是这个。在项目中 在“属性”->“ C / C ++构建”->“设置”->“工具设置”->“跨G ++编译器”中,从“其他”中删除-std = gnu ++ 17,然后将其放入“方言”->“其他方言标志”中。

答案 15 :(得分:0)

使用交叉编译器时,我经常得到同事精心打造的高级自定义构建系统。我使用“带有现有代码的Makefile项目”,因此其他大多数答案都不适用。

在项目开始时,我必须在“具有现有代码的Makefile项目”向导中指定使用交叉编译器。令人讨厌的是,在过去的10年左右的时间里,该向导上的交叉编译器按钮没有提示交叉编译器在哪里。因此,在解决C ++问题和交叉编译器问题的步骤中,我必须转到上面的@ravwojdyla之类的答案提到的providers选项卡,但是我必须选择的提供程序是cross-compiler提供程序。然后,在命令框中输入编译器的完整路径,并为我要支持的C ++标准添加-std = gnu ++ 11。这是可以预期的。

您可以对现有项目执行此操作。您唯一需要做的就是重新运行索引器。

我从来不必添加实验性标志或覆盖__cplusplus的定义。 唯一的是,如果我有大量的现代C代码,那么我无处可放C特定的标准选项。

因为情况真的很糟糕,在Indexer子菜单中使用该命令获取解析器日志可能非常有用。