c++ - Eclipse CDT:无法解析符号'cout'




include eclipse-cdt include-path (13)

对我来说,它有助于在Properties - > C / C ++ - Build - > Discovery Options中启用自动发现来解决此问题。

错误如上所述。 我有什么应该是eclipse项目中包含的所有必要文件:

/usr/include/c++/4.6
/usr/include
/usr/include/linux
/usr/local/include

等等

我试过std::coutusing namespace std; cout但它仍然没有解决。

我导入了iostreamcstdlib

另外,我在Ubuntu 12.04上使用eclipse 3.7.2。

代码段:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"

int XPluginStart(char * outName,  char * outSig,  char * outDesc) {
    /* ... */
    std::cout << "test" << std::endl;
    /* ... */
}

使用命名空间std;

更新:我从现有代码创建了eclipse项目。 创建一个新的c ++项目可以修复它。 我会接受一个解释,解释现有项目中的设置可能导致这种情况(所以我不必剪切和粘贴我的所有项目)。


我使用MinGW和gcc 4.8.1与* std :: shared_ptr *有类似的问题。 无论如何,Eclipse都不会解析* shared_ptr *。 为了解决这个问题,我手动将__cplusplus宏添加到C ++符号中 - 中提琴! - Eclipse可以找到它。 由于我将-std = c ++ 11指定为编译选项,因此I(ahem)假设Eclipse代码分析器也会使用该选项。 所以,解决这个问题:

  1. 项目上下文 - > C / C ++常规 - >路径和符号 - >符号选项卡
  2. 在“语言”面板中选择“C ++”。
  3. 添加符号__cplusplus ,其值为201103

唯一的问题是gcc会抱怨符号已经定义(!)但编译将像以前一样完成。


要摆脱您不想要的符号警告,首先您应该了解Eclipse CDT通常如何首先提出未知符号警告。 这是它的过程,或多或少:

  1. Eclipse检测系统上可用的GCC工具链
  2. 您的Eclipse项目配置为使用特定的工具链
  3. Eclipse在工具链上进行发现以找到其包含路径和内置定义,即通过运行相关选项并读取输出
  4. Eclipse从包含路径读取头文件
  5. Eclipse会为项目中的源代码编制索引
  6. Eclipse在编辑器中显示有关未解析符号的警告

从长远来看,修复前面步骤的问题可能会更好,而不是通过手动添加包含目录,符号等来覆盖其结果。

工具链

如果您安装了GCC,并且Eclipse已经检测到它,它应该将GCC列为新C ++项目可以使用的工具链选项,这也将显示在Window -> Preferences -> C/C++ -> New CDT Project WizardPreferred Toolchains选项卡右侧的Toolchains框中。 如果它没有显示,请参阅CDT FAQ关于需要特殊环境的编译器的答案 (以及Windows民众的MinGWCygwin答案。)

如果您有一个现有的Eclipse C ++项目,则可以通过打开项目属性,转到C/C++ Build -> Tool Chain Editor并从Current toolchain: pulldown中选择所需的工具链来更改相关的工具Current toolchain: 。 (如果所需的工具链与之前在项目中设置的工具链不同,则必须先取消选中“ Display compatible toolchains onlyDisplay compatible toolchains only框。)

如果在启动Eclipse后向系统添加了工具链,则需要重新启动它才能检测工具链。

发现

然后,如果项目的C/C++ Build -> Discovery Options -> Discovery profiles scope设置为Per Language ,则在下一次构建期间,与项目关联的新工具链将用于自动发现包含路径和符号,并且用于更新项目的C/C++ General -> Paths and Symbols IncludesSymbols选项卡中的路径和符号中显示的“内置”路径和符号。

索引

有时您需要在设置工具链并进行构建后再次重新索引以使旧符号警告消失; 右键单击项目文件夹,然后转到Index -> Rebuild以执行此操作。

(使用Eclipse 3.7.2 / CDT 8测试)


你们正在寻找错误的部分。 我在最近对Windows感到沮丧之后在Linux中安装时意识到了差异,但差异很明显。

在新的设置中,我在一个我用现有源创建的投影中有一个包含文件夹。 我可以扩展这个并看到大量的包括; 但是,我无法添加它们。 这导致我寻找列出这些文件的位置。

它们列在项目属性> C / C ++通用>预处理器包含> GNU C ++ CDT GCC内置编译器设置[共享]下,这是很多包含。

这些设置由您选择的工具链设置。


我在WindowsCygwin Windows上使用Eclipse CDT (Kepler)时遇到了同样的问题。 在我想到的每个Cygwin包括项目属性之后,它仍然找不到cout

最后遗失的部分原来是C:cygwin64\lib\gcc\x86_64-pc-cygwin\4.8.2\install-tool\include

总结一下:

  • 右键单击该项目
  • 选择Properties
  • 导航到C/C++ General > Paths and Symbols > Includes选项卡
  • 点击Add...
  • 单击File system...
  • 浏览到您的Cygwin lib\gcc\x86_64-pc-cygwin\4.8.2\install-tool\include
  • 单击OK

这是我的项目所包含的内容,看起来就像是说完了所有内容:


我只是删除了buttom:问题列表中的所有错误。 然后关闭项目并重新打开项目清理项目构建所有运行

然后是那些愚蠢的错误。


感谢上面的答案加载。 我正在为特定用例添加答案......

在一个具有两个目标体系结构的项目中,每个目标体系结构都有自己的构建配置(主要目标是嵌入式AVR平台;第二个目标是我用于运行单元测试的本地Linux PC)我发现有必要设置Preferences -> C/C++ -> Indexer -> Use active build configuration以及将/usr/include/c++/4.7 /usr/include/usr/include/c++/4.7/x86_64-linux-gnuProject Properties -> C/C++ General -> Paths and Symbols然后重建索引。


您的设置中很可能缺少一些特定于系统的包含目录,这使得索引器无法正确解析iostream,从而导致错误。 在项目的上下文菜单中选择Index -> Search For Unresolved Includes将为您提供可在/usr/include搜索的未解析包含列表,并将包含目录添加到C++ Include Paths and Symbols项目属性中的C++ Include Paths and Symbols

在我的系统上,我必须添加/usr/include/c++/4.6/x86_64-linux-gnu/usr/include/c++/4.6/x86_64-linux-gnu bits/c++config.h以及更多目录。

添加包含目录后,不要忘记重建索引(索引 - >重建)。


我正在使用Ubuntu 12.04 / Eclipse 4.2.1 / CDT 8.1.1并且我曾经有过相同的问题已经有一段时间了:从SVN导入C ++项目会导致这些烦人的“未解决的包含”错误而我必须创建一个新项目并将其中的文件复制为一种解决方法(仍然是部分的,因为SVN功能不存在!)。

最后,我刚刚找到了一个简单,令人满意的解决方案:

  • 转到Project -> Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers并选中Enable language settings providers for this project

  • 重启Eclipse。

希望这已经成功了。


如果所有其他方法都失败了,就像在我的情况下那样,那么只需禁用注释。 我用自己的makefile启动了一个c ++ 11项目,但无法解决所有问题。 即使你禁用注释,eclipse仍然可以帮助你做一些自动完成。 最重要的是,调试器仍然有效!


我在ArchLinux上更新gcc和eclipse后发生了这种情况。 为我解决的是Project -> C/C++ Index -> Rebuild


我在Ubuntu 16.04上使用cmake创建了Makefile项目。

当为生成cmake的Makefile创建eclipse项目时,我创建了新项目,如下所示:

文件 - >新建 - >包含现有代码的Makefile项目。

只有经过几次这样做,我才注意到“索引器设置工具链”的默认设置为无。 在我的情况下,我已将其更改为Linux GCC,所有错误都消失了。

希望它有所帮助,如果它不是一个合法的解决方案,请告诉我。

干杯,

盖伊。


不,这不是真的。 如果一个函数需要一个指针并且与所有权无关,那么我强烈认为应该传递一个常规指针,原因如下:

  • 没有所有权,因此你不知道什么样的智能指针传递
  • 如果你传递一个特定的指针,比如shared_ptr ,那么你将无法传递scoped_ptr

规则就是这样 - 如果你知道一个实体必须对该对象拥有某种所有权,那么总是使用智能指针 - 一种能够为你提供所需所有权的指针。 如果没有所有权的概念, 永远不要使用智能指针。

例1:

void PrintObject(shared_ptr<const Object> po) //bad
{
    if(po)
      po->Print();
    else
      log_error();
}

void PrintObject(const Object* po) //good
{
    if(po)
      po->Print();
    else
      log_error();
}

例2:

Object* createObject() //bad
{
    return new Object;
}

some_smart_ptr<Object> createObject() //good
{
   return some_smart_ptr<Object>(new Object);
}






c++ eclipse include eclipse-cdt include-path