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


210

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

不确定是否正确-char []可转换为char *,unique_ptr <char>是char的指针,例如char *
Nick

1
不会unique_ptr<char>调用delete,因为它是用创建的,这是错误的new[]
Dietrich Epp '02

6
@尼克:不,他是对的。您编写它的方式将delete需要 delete[]调用时被调用。该unique_ptr<char>假设它得到一个指针,而它与删除deleteunique_ptr<char[]>需要一个数组,该数组将delete[]正确删除。
Nicol Bolas'2

Answers:


224

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

  • 制作一个新的C ++项目
  • 一切的默认选项
  • 创建完成后,右键单击项目并转到“属性”
  • C / C ++构建->设置->工具设置-> GCC C ++编译器->其他->其他标志。放-std=c++0x(或最后使用较新的编译器版本-std=c++11。...代替GCC C ++编译器,我也有Cygwin编译器
  • C / C ++常规->路径和符号->符号-> GNU C ++。单击“添加...”,然后粘贴__GXX_EXPERIMENTAL_CXX0X__(确保在两个下划线之前加上并加上下划线)到“名称”中,并将“值”留为空白。
  • 单击“应用”,执行要求您执行的所有操作,然后单击“确定”。

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

Eclipse图像设置


2
是的,它有效!但是,请确保在GXX_EXPERIMENTAL_CXX0X前面加上两个下划线-同时我会接受这一点
Nick

5
这是否消除了虚假的编辑器错误?我的编译没有问题,并且可以识别新的std类型,但是我无法摆脱基于范围的循环和右值引用的编辑器语法错误&&
juanchopanza 2012年

7
现在自然会产生以下问题:我们可以通过将这些特定的C ++项目设置保存到新的Eclipse项目模板(例如“ C ++ 11 Project”)中来优化工作流程吗?
2012年

38
注意:对于任何寻求Juno答案的人,此方法均无效
Christopher

4
对于开普勒/朱诺,可在此答案中找到解决方案。它被张贴在下面对约翰·伦德伯格(Johan Lundberg)的答复的编辑中,但我也在此处指出,以使所接受的答案更加完整。
不可用的卢米埃(Lumière),

150

Eclipse CDT 4.4 Luna和4.5 Mars的说明

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

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

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

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

对于创建为的项目:文件->新建->项目-> C / C ++-> C ++项目

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

Properties-> C/C++ Build-> Settings-> Tool Settings-> GCC C++ Compiler->Dialect

放入-std=c++11标题为other dialect flagsISO C++11Language standard下拉列表中选择的文本框。

对于CMake项目

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

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

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

Properties-> C/C++ General-> Preprocessor Include Paths, Marcos etc.->Providers

启用CDT GCC Build-in Compiler Settings并将其移动到更高位置Contributed PathEntry Containers(这很重要)

最后共同步骤

重新编译,重新生成Project-> C/C++ Index并重新启动Eclipse。


1
即使不需要重新启动也可以完美工作。谢谢。
prasannak'2

谢谢。Luna上也没有其他答案对我有用。
Mohamed El-Nakib'3

仍在火星上运作。绝妙的答案!如果我只能对这个答案投票两次!
穆罕默德·纳基布

谢谢!对于遇到的问题,这是最有用的答案(4.5)
AturSams,2015年

2
对于具有C ++ Makefile项目的Eclipse Neon.3,要添加-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

112

2016年更新:

gcc 6开始更改),默认的C ++方言为C ++ 14。这意味着除非您明确需要一个比其更新或更旧的方言,否则您将不再需要进行日食处理。

对于露娜和火星

这个社区Wiki部分包含Trismegistos的答案;

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

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

在标题为获取编译器规格的命令的文本框中追加-std=c++14 2。创建项目,配置取决于您创建的项目类型:

对于创建为的项目:文件->新建->项目-> C / C ++-> C ++项目

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

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

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

现在有了一种无需GXX_EXPERIMENTAL hack即可解决此问题的新方法。

对于最新版本:(当前为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下(在项目设置中),找到Preprocessor Include Path并转到Providers选项卡。取消选择除CDT GCC内置编译器设置以外的所有内容。然后取消标记共享设置条目...。将选项-std = c ++ 11添加到名为Command的文本框中以获取编译器规格。

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


笔记:

Eclipse对应用很挑剔,您每次离开设置标签都需要这样做。

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

由于用户Nobodyhttps://stackoverflow.com/a/13635080/1149664


3
谢谢,但是这并没有帮助我解决c ++ 11引用。程序可以正确编译,但是eclipse无法解决它们。当我检查“数组”时,#ifndef __GXX_EXPERIMENTAL_CXX0X__返回true,并且下面的代码未解析。当我添加__GXX_EXPERIMENTAL_CXX0X__到项目符号时,数组得到解析,但是我项目的引用被弄乱了。这可能是什么问题?
Halil Kaskavalci 2012年

1
我认为这是一个错误。我是这样复制它的:打开新项目。启用c ++ 11功能。添加带有公共变量的随机类。创建此随机类的向量。获取迭代器。尝试访问公共变量。我的工作空间已损坏,或者Eclipse中有一个无法解析此错误的错误。
Halil Kaskavalci 2012年

1
@HalilKaskavalci我发现了这个错误。如果我将编辑器设置为c ++ 11,则迭代器无法解析。如果我不这样做,则std :: unique_ptr无法解析。真的很烦,因为我同时使用了两者。
肯(Kian)2012年

1
@Kian我报告了该错误。bugs.eclipse.org/bugs/show_bug.cgi?id=397027。这很烦人,我开始使用Boost库,它们不会产生错误:)
Halil Kaskavalci 2012年

1
为我工作!谢谢!(请您参考一下)我将-std = c ++ 11添加到提供程序并恢复了符号的默认值。我认为在符号中恢复默认设置可以拯救我。现在unique_ptr正在解析。
Denis Zaikin 2014年

20

对于最新的(Juno)eclipse cdt,以下内容对我有用,无需__GXX_EXPERIMENTAL_CXX0X__自我声明。这适用于CDT索引器和编译器的参数:

“您的项目名称”->右键单击->属性:

C / C ++常规->预处理器包含路径,宏等->切换到名为“提供程序”的选项卡:

  • 对于“配置”,选择“发布”(然后选择“调试”)

  • 关闭所有提供程序,只需选择“ CDT GCC内置编译器设置”

  • 取消选中“在项目之间共享设置项(全局提供者)”

  • 在“获取编译器规格的命令:”中添加不带引号的“ -std = c ++ 11”(也可以使用引号)

  • 点击应用并关闭选项

  • 重建索引

现在,所有与c ++ 11相关的东西都应该由索引器正确解决。

win7 x64,来自Sourceforge上mingwbuilds项目的带有cdt mingw-w64 gcc 4.7.2的最新正式日食


仍然会得到相同的错误编辑器警告,即使它可以编译并执行OK也无法解决类型'std :: thread'中的问题
Scott Stensland 2013年

2
您需要使用新设置进行一次编译,因此解析器将“了解”已设置std = c ++ 11标志
Andreas 2013年

根据编译器版本的不同,可能有必要添加-std = c ++ 0x而不是-std = c ++ 11(例如debian wheezy)
xmoex 2014年

15

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

  • 转到Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols]
  • 添加符号:__cplusplus,值为201103L

2
这应该被接受,因为它也适用于Makefile项目!
omikron 2014年

@ Jerk31这不适用于在Windows上运行的Eclipse Juno(对我来说),尽管二进制文件运行正常,但我仍然看到那些抱怨的不必要的错误。请帮我!!!
2015年

非常抱歉,我无法在Windows上为您提供帮助,我没有机会尝试在此OS上执行任何C ++项目。祝你好运!
杰罗姆(Jerome)2015年

13

对于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. 单击确定,然后为项目重建索引。

对于开普勒来说,仅-std=c++11Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->OtherFlags 添加项目还不够,但是对于诸如Helios之类的较旧版本而言,这已经足够了。


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

5

我还无法发表评论,所以我正在写自己的答案:

它与__GXX_EXPERIMENTAL_CXX0X__Eclipse Juno和CDT 8.x 有关,并且对它有效。

此答案的某些部分已包含在其他答案中,但我希望它是连贯的。

为了使用stdc ++ 11进行构建,必须为编译器添加特定的标志。您可以通过项目属性来实现。修改项目属性RMBProject propertiesALT + ENTER。然后C / C ++构建->设置->工具设置-> GCC C ++编译器->其他->其他标志。在行尾添加-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 ++常规->路径和符号->符号-> GNU C ++。单击“添加...”, ”,__GXX_EXPERIMENTAL_CXX0X__(确保在两个下划线之前附加并加下划线)输入“名称”,并将“值”留空。现在是我想在第一个答案的注释中涉及的额外部分,请转到:C / C ++常规->预处理器包括路径宏等->提供程序,然后选择CDT Managed Build Setting Entries然后单击“应用”,然后返回到“条目”选项卡,在GNU C ++下,现在应该有CDT托管构建设置条目,检查是否在其中定义__GXX_EXPERIMENTAL_CXX0X__了->“应用”并重建索引。


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 ++常规->路径和符号->选择了符号TAB,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

在运行时。


这是Project -> Properties -> C/C++ Build -> Settings -> Miscellaneous对我有用的步骤。感谢一堆:D
Jake88

2

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

一旦创建了C ++项目

(1)C / C ++常规->路径和符号->符号-> GNU C ++。单击“添加...”,然后将GXX_EXPERIMENTAL_CXX0X(确保在两个下划线之前加上并加上下划线)粘贴到“名称”中,并将“值”保留为空白。

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

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


这对我也有用(偏食霓虹灯)。最初,我没有取消选择其他提供程序,但仍然会导致问题,但是取消选择了除“ CDT GCC内置编译器设置”和“ CDT用户设置”之外的所有其他提供程序。谢谢!
zpon

2

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

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

项目->属性-> C / C ++常规->预处理器包含路径-> GNU C ++-> CDT用户设置条目

  1. 点击“添加...”按钮

  2. 从下拉菜单中选择“预处理器宏”

    Name: __cplusplus     Value:  201103L
  3. 单击“应用”,然后单击“确定”返回您的项目

  4. 然后重建您的C ++索引:项目-> C / C ++索引->重建


这是在Eclipse 2018-12中对我有用的唯一方法。“接受的”答案等在2018-12年度不再有效。
David Steinhauer,

1

对于我在Eclipse Neon上的问题,我遵循上面的Trismegistos回答,但是我还添加了一个附加步骤:

  • 转到项目->属性-> C ++常规->预处理器包含路径,宏等。->提供程序-> CDT Cross GCC内置编译器设置,附加标志“ -std = c ++ 11”

点击“应用”,然后单击“确定”。

干杯,

伙计


0
  • 右键单击该项目,然后转到“属性”
  • C / C ++构建->设置->工具设置-> GCC C ++编译器->其他->其他标志。将-lm放在其他标志文本框的末尾,然后单击确定。

这是什么版本的Eclipse?
Braiam

0

hack和Cleaner版本均不适用于Indigo。hack将被忽略,并且缺少必需的配置选项。出于没有明显的原因,build在不工作并且没有提供任何有用的原因后才开始工作。至少从命令行可以得到可重复的结果。


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。它应该按预期工作。


0

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

我将CD CD到/ usr / local / bin并从g ++ @ 7到g ++进行了符号链接,导致@ bit令人讨厌。

然后我转到MyProject-> Properties-> C / C ++ Build-> Settings-> GCC C ++ Compiler,并将命令从“ g ++”更改为“ / usr / local / bin / g ++”。如果您决定不进行符号链接,则可以更具体。

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

应用并应用并关闭。让它重建索引。有一段时间,它显示出许多令人生畏的错误,但是我认为那是在建立索引时。当我找出错误时,它们都消失了而没有采取进一步措施。


我认为,如果不验证您是否还可以进入Eclipse-> Properties-> C / C ++-> Core Build Toolchains并编辑具有不同路径的代码,但是我不确定该怎么做。


0

对于使用std :: optional和std :: swap的混合C和C ++项目,我使用Eclipse C ++ 2019-03遇到类似的问题。对我有用的是这个。在项目的Properties-> C / C ++ Build-> Settings-> Tool Settings-> Cross G ++ Compiler中,从Miscellaneous中删除-std = gnu ++ 17,然后将其放在Dialect-> Other Dialect Flags中。


0

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

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

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

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

而且对于情况确实很差的情况,使用Indexer子菜单中的命令获取解析器日志可能会很有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.