【发布时间】:2013-07-20 00:08:12
【问题描述】:
我在 Ubuntu 12.04 x64 上,使用带有 CDT 插件的 Eclipse Indigo,我的 g++ 版本是 4.7.3。我添加了编译器选项-std=c++11 和发现选项的相同选项(即使我编写代码时代码没有自动完成)。
Eclipse 用红色强调以下部分并给出警告。但是,程序在运行时(忽略错误)会打印预期结果(Compiled with gcc 4.7\n 1 0\n)。如何解决此问题?
#include <unordered_set>
#include <iostream>
using namespace std;
int main()
{
unordered_set<int> s; // Symbol unordered_set cannot be resolved
cout << "Compiled with gcc " << __GNUC__ << '.' << __GNUC_MINOR__ << endl;
s.insert(0); // Method insert cannot be resolved
s.insert(1); // Method insert cannot be resolved
s.insert(0); // Method insert cannot be resolved
for(auto i = s.begin(); i != s.end(); ++i) cout << ' ' << (*i);
// Method begin and end cannot be resolved
cout << endl;
return 0;
}
这是 Eclipse 在命令行中调用的:
...$ gcc -E -P -v -dD -std=c++11 .../specs.c
Using built-in specs.
...
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04)
为我的C 编译器关闭-std=c++11 编译器选项后(因为无论如何都不需要它) - 但 为C++ 编译器保持它打开,输出打印到控制台如下。
...$ g++ -E -P -v -dD -std=c++11 .../specs.cpp
Using built-in specs.
...
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04)
而且,无论 Eclipse 向我显示什么错误,输出仍然是相同的,显示无序集可以正常工作并且已正确编译。这显然只是构建之前的一个问题。如果我的索引器在构建之前没有正确解析,那么该集合在运行时如何工作?
【问题讨论】:
-
您可能安装了多个版本的 GCC,而 Eclipse 不知何故最终使用了错误的版本? (在代码中插入
std::cout << "Compiled with gcc " << __GNUC__ << '.' << __GNUC_MINOR__ << std::endl;之类的东西,让它输出用于编译它的 GCC 版本。) -
@jogojapan 是的,我确实安装了多个版本的 GCC,但您的代码返回“使用 gcc 4.7 编译”——应该有 c++11,对吧?
-
是的,没错。从 4.7 开始,C++11 选项确实是
-std=c++11(在 4.6 和更早版本中它曾经是-std=c++0x)。所以,我不知道为什么它不起作用。 -
也许编译器是正确的版本,但标准库的包含文件不是。我有一段时间没有为多个 GCC 版本配置 Eclipse,但是在某个地方没有包含目录的选项吗?也许它会从错误的 GCC 安装中获取它们。
-
@jogojapan 是的,这就是我难过的原因。我跟着c ++ 11激活到一角钱,它仍然不起作用。我应该删除我的旧 gcc 安装(我该怎么做?)?项目资源管理器在我的项目中有一个“包含”目录 - 它显示 unordered_map 文件 - 我将发布一张图片。谢谢你的时间,顺便说一句。
标签: c++ eclipse c++11 eclipse-cdt