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停止抱怨这类错误?
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停止抱怨这类错误?
我在Eclipse论坛上找到了这篇文章,按照步骤操作后,它对我来说有效果。我正在Windows上使用带有Cygwin配置的Eclipse Indigo 20110615-0604。
-std=c++0x
(或者对于更新的编译器版本, 输入 -std=c++11
),而不是GCC C++ Compiler,我也有Cygwin编译器__GXX_EXPERIMENTAL_CXX0X__
(确保前后都有两个下划线)粘贴到“名称”中,并将“值”留空。现在在Eclipse FAQ中也有关于此问题的描述:Eclipse FAQ/C++11 Features。
Eclipse设置
首先,在创建项目之前,请配置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。
autotools项目
,第一步解决了问题。 - Jichao-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更新于2016年:
从gcc 6 (更改)开始,默认的C ++方言是C++14。这意味着,除非你明确需要比此更新或较旧的方言,否则无需再使用eclipse进行任何操作。
此社区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
对于作为项目创建的文件: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。
对于最新版本:(目前为Juno和KeplerLuna):
在Juno的较新版本下,设置位于项目属性 -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ()
。
旧版2012/2013:
在C/C++构建(项目设置中),找到预处理器包含路径,进入提供程序选项卡。取消选择除CDT GCC内置编译器设置之外的所有选项。然后取消共享设置条目... 在命令文本框中添加选项-std=c++11以获取编译器规范。
转到路径和符号。在符号下,点击恢复默认值,然后应用。
注意事项:
Eclipse对于应用非常挑剔,每次离开设置标签时都需要进行应用操作。
[自我推广]: 我基于以上内容撰写了自己更为详细的说明。 http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds
#ifndef __GXX_EXPERIMENTAL_CXX0X__
返回true,并且其下方的代码未被解析。当我将__GXX_EXPERIMENTAL_CXX0X__
添加到项目符号中时,数组得到了解析,但我的项目的引用出现了混乱。这里可能有什么问题? - Halil__GXX_EXPERIMENTAL_CXX0X__
。 这适用于CDT索引器和编译器参数:我在Eclipse Juno上也遇到了同样的问题。按照以下步骤解决:
项目 -> 属性 -> C/C++常规 -> 路径和符号 -> 标签[符号]
。针对Eclipse CDT Kepler,我成功消除了std::thread
未解决的符号,方法如下:
进入偏好设置->C/C++->构建->设置
选择“发现”选项卡
选择CDT GCC内置编译器设置[共享]
将-std=c++11添加到“获取编译器规范的命令:”字段中,如下所示:
${COMMAND} -E -P -v -dD -std=c++11 ${INPUTS}
对于Kepler,将-std=c++11
添加到项目属性/C/C++构建->设置->工具设置->GCC C++编译器->杂项->其他标志
并不足够,但对于较旧的版本,如Helios则足够了。
我还不能发表评论,所以我写了自己的答案:
这与__GXX_EXPERIMENTAL_CXX0X__
有关,适用于Eclipse Juno和CDT 8.x。
这个答案的一些部分已经在其他答案中涉及,但我希望它更连贯。
为了使stdc++11编译成可能,必须为编译器添加特定的标志。您可以通过项目属性来完成。要修改项目属性,请单击RMB
和Project properties
或ALT + 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并重建索引,此时您应该没问题了。
我也遇到了几个问题(Ubuntu 13.04 64位、g++-4.8、eclipse Juno 3.8.1、CDT 6.0.0)。上面提到了很多事情,抱歉重复了一些,但是我还遇到了利用的问题。
std::thread
-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 - Jake88std::unique_ptr
,即使您已在文件中包含了C++11内存头文件。假设您正在使用GNU C++编译器,以下是我解决问题的方法:Click on the "Add..." button
Select "Preprocessor Macro" from the dropdown menu
Name: __cplusplus Value: 201103L
Hit Apply, and then OK to go back to your project
Then rebuild you C++ index: Projects -> C/C++ Index -> Rebuild
std::unique_ptr<char[]>
。 - Cubbiunique_ptr<char>
不会调用delete
,因为它是通过new[]
创建的,这是错误的吗? - Dietrich Eppdelete
,但你需要调用delete[]
。unique_ptr<char>
假设它得到的是一个指针,会使用delete
进行删除。而unique_ptr<char[]>
则期望一个数组,并使用delete[]
正确地进行删除。 - Nicol Bolas