Eclipse CDT显示语义错误,但编译是可以的

时间:2011-11-16 07:44:25

标签: eclipse gcc eclipse-cdt

我已经在Ubuntu 10.04 x86上为C / C ++ Linux开发人员安装了Eclipse Indigo。

当我使用常见的预定义宏__BASE_FILE__时,Eclipse说Symbol '__BASE_FILE__' could not be resolved,但编译没问题。我必须经常在我的代码中使用它,Eclipse用红线和bug图标填充我的屏幕:)

我该如何解决这个问题?

20 个答案:

答案 0 :(得分:23)

不确定这是否解决了您的具体问题,但我也有语义错误。在完成一个有效的项目之后,他们才刚刚出现。

无论如何,我通过设置在工作区设置中使用单个选项修复它: “构建索引器的配置:使用活动的构建配置”

另一个选项是“使用项目索引器设置中指定的构建配置”,这是一个无效的选项。我认为在日食崩溃后它可能已经被破坏了。

答案 1 :(得分:20)

窗口 - >偏好 - > C / C ++ - >代码分析 - >语法和语义错误:关闭

这不能解决问题的原因,但至少会阻止显示错误错误。

答案 2 :(得分:5)

删除.metadata文件夹,然后删除导入项目。

这种方式还行!

答案 3 :(得分:5)

最简单的解决方案是重置索引器:

Window / Preferences / C / C ++ / Indexer。
取消选中"启用索引器" - >>行
重建所有,可能会显示很多错误 检查"启用索引器" - >>行
重建所有

这种错误可以通过电源故障强制关闭日食来产生。

答案 4 :(得分:3)

IMO正确的解决方案是在Project中定义符号 - >属性 - > C / C ++通用 - >路径和符号 - >符号标签。由于您可以假设编码器始终提供符号,因此您只需告诉Eclipse将其视为已定义。

我最近遇到了同样的问题,Eclipse抱怨未定义的宏,我总是使用-D<MACRO_NAME>编译器选项提供。

答案 5 :(得分:3)

更新: 您必须向Project-&gt; Propoerties-&gt; C / C ++ General-&gt;路径和符号添加正确的路径。如果它没有帮助,您可以在Project-&gt; Properties-&gt; C / C ++ General-&gt; Code Analysis中配置Eclipse Code Analyzer(生成'错误')。根据您遇到问题的错误说明,请尝试自定义所选项 - &gt;范围 - &gt;排除模式。

答案 6 :(得分:3)

我认为它与workspace / .metadata有关。 我遇到了报告语义错误的问题,但Hello World编译并运行。 我删除了项目,创建了另一个,同样的错误报告。重新安装CDT,同样的事情。删除工作区,关闭Eclipse,重新启动,创建新的hello world,同样的事情。再次删除工作区,再次关闭Eclipse,这次注意到Eclipse在关闭期间无法找到它时重新创建了工作区文件夹。在Eclipse关闭的情况下删除了工作区。重新启动Eclipse,创建了HW项目,错误显示大约一秒然后消失。删除项目,创建另一个,错误显示一秒,然后poof。 如果你的工作区实际上有项目(我的是一个干净的安装),我打赌你可以删除工作区内的.metadata文件夹,它会修复它。

答案 7 :(得分:2)

您需要重建项目的索引。

右键单击项目,然后右键单击Index-&gt; Rebuild。

答案 8 :(得分:1)

在我的情况下,我最终发现索引器出现问题,因为同事“有帮助”地在两个头文件中复制了全部声明,而这些头文件只包含在项目中的C文件。删除重复项(并使一个标头包含另一个标头)可使索引器再次正常工作。

由于某些原因,特别是重复枚举的问题。我不知道为什么会这样。

答案 9 :(得分:1)

作为另一个答案添加,希望这将有助于某人。

我有一个简单的工作区(1个c ++共享对象(linux的DLL版本,3个c ++可执行文件和一个pydev python项目)

我检查了所有代码到新机器,并且它构建正常但在std-c和std-C ++代码上有很多“语义错误”并且包括..我经历了所有发现/索引器设置无济于事

==&GT;删除整个.metadata文件夹修复此问题。

由于我在工作区中没有任何非平凡的设置(所有在项目文件/ makefile中),eclipse愉快地创建了一个新的工作区,我只需要做一个文件 - &gt; import-&gt;现有项目

答案 10 :(得分:1)

我个人同意compostus的回答。

解决eclipse代码分析器的真正问题是很好的。

但是当我尝试这个步骤时: 在Project中定义符号 - &gt;属性 - &gt; C / C ++通用 - &gt;路径和符号

我找不到符号标签或任何添加符号的地方。我想要做的是将-DANDROID或#define ANDROID 1等宏放到eclipse中,以便代码分析器可以找到这个定义。

我在Mac OSX山狮之下。

答案 11 :(得分:0)

如果在Ubuntu上,请转到Window&gt;偏好&gt;在搜索框中键入“Indexer”&gt;在左列中选择Indexer。 在“索引器选项”标题下,勾选以下选项(除了涉及跳过文件的选项外):

  • 索引文件未包含在项目中的源文件
  • 索引未使用的标头索引所有标头变体
  • 索引源文件和头文件在编辑器中打开
  • 允许启发式解析包含

在“索引策略”标题下,勾选两个选项:

  • 自动更新索引
  • 每次文件保存后立即更新索引

在标题“索引器的构建配置”标题下,选择以下选项:

  • 用户有效构建配置

答案 12 :(得分:0)

不确定这是否适用于OP问题,但我在eclipse Luna中遇到了语义错误,并且能够通过遵循此主题中的说明来解决它们:Eclipse shows unresolved inclusion but it compiles

  

编译器找到标题,但Eclipse不是。

     

您可以帮助Eclipse并在以下位置设置头文件的路径:

     

项目 - &gt;属性 - &gt; C / C ++ Build - &gt;设置 - &gt;编译器 - &gt;   包括

在我的情况下,eclipse确定了我的一个include目录,但没有确定其中有子包含目录。

答案 13 :(得分:0)

我有一个类似的问题,但我的编译很好,但Eclipse在使用另一个包含文件的#define的行上显示错误。我通过检查&#34;索引所有标题变体&#34;来修复。我认为包含文件中的类别#ifndef FILENAME 在Indexer中多次处理,因此第二次定义了 FILENAME ,因此.h文件中的所有#defines都不是&# 34;看出&#34;由预处理器。转到窗口|偏好| C / C ++ |索引器。

答案 14 :(得分:0)

我在代码中使用了 #pragma once 。这种配置导致我遇到问题:

--- --- fileA.h

#pragma once
#define MYMACRO(X) func(X)

--- --- fileB.h

#include "fileA.h"

--- --- fileB.cpp

#include "fileB.h"

MYMACRO(5)  <---- warning here

我用#ifndef #define HEADER_FILE_H #endif替换了一次#pragma,解决了这个问题。

答案 15 :(得分:0)

试试这个:

偏好设置 - &gt; c / c ++ - &gt;索引器 - &gt;索引所有标题变体

选中此选项。

答案 16 :(得分:0)

问题是这样发生的:我在代码中插入一个新的变量名,例如:这个例子中的“newone”:

int a;

foo()
{
  a=17;
  newone=23;
}

保存文件(因此索引器正在重建索引)。 然后我添加了定义:

int a, newone;

foo1()
{
  newone=0;
}


foo()
{
  a=17;
  newone=23;
}

索引器仍会在“newone = 23;”行显示错误但不是包含“newone”的其他代码行。

解决方案:首先定义变量,然后使用它。

微米。

答案 17 :(得分:0)

这是文件索引问题。

解决方案-右键单击该项目,然后单击索引->刷新所有文件。

(适用于Eclipse CDT.Oxygen)

答案 18 :(得分:-1)

我有同样的问题。编译器预处理没问题,但静态分析器没有。在我的源文件中:

#define PLATFORM_INC_FILES
#include <platform.h>

int coflags=O_BINARY; // Undefined symbol

在platform.h(一个与操作系统相关的标题,以帮助创建可移植代码):

#ifdef PLATFORM_INC_FILES
    #include <stdio.h>
    ...

在预处理包含的标头时,静态分析器似乎不会考虑.c #define语句。通过在符号对话框中定义它,错误消失,但这是一个项目范围符号定义,导致每个源包含我的每个系统头。

希望很快得到解决......

在MSIS2上使用Eclipse Mars和MinGW。

答案 19 :(得分:-1)

过去,我会在以下位置定义ANDROID符号: 项目 - &gt;属性 - &gt; C / C ++通用 - &gt;路径和符号 - &gt; #Symbols标签 但是,最新版本的Eclipse不再具有#符号或其他任何地方。 似乎在Eclipse中不再有任何定义符号的方法。 Eclipse有很多错误和问题。 我终于放弃了并转而使用Gedit和终端进行编译。