Eclipse CDT 显示语义错误,但编译正常

Posted

技术标签:

【中文标题】Eclipse CDT 显示语义错误,但编译正常【英文标题】:Eclipse CDT shows semantic errors, but compilation is ok 【发布时间】:2011-12-30 04:46:46 【问题描述】:

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

当我使用常见的预定义宏__BASE_FILE__ 时,Eclipse 会显示Symbol '__BASE_FILE__' could not be resolved,但编译是可以的。我必须在我的代码中经常使用它,而 Eclipse 用红线和错误图标填充我的屏幕:)

我该如何解决这个问题?

【问题讨论】:

也许这会有所帮助:see here 【参考方案1】:

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

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

另一个选项是“使用项目索引器设置中指定的构建配置”,这是一个不起作用的选项。我认为它可能在 eclipse 崩溃后被损坏了。

【讨论】:

似乎是静态分析器的错误,而不是索引器。无论如何,它对我不起作用。感谢您的努力。 嗨,talot,我无法找到如何访问“工作区设置”>“索引器的构建配置:使用活动构建配置”。你能告诉我在哪里可以找到它。谢谢 @ahmed_khan_89 窗口 -> 首选项 -> C/C++ -> 索引器 在我的情况下,另一个选项被选中“使用项目索引器设置”或类似的东西。但是在我的项目设置中,“启用项目特定的索引器设置”框无论如何都被禁用了。所以它应该自动获取全局/活动构建配置。但是显式切换到活动构建配置让讨厌的红色曲线消失了!【参考方案2】:

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

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

【讨论】:

我几乎不赞成您的答案,因为它不是正确的解决方案,但经过尝试,您的解决方案是最好的。我通过调用 boost 和 quince 函数报告了很多错误,这些错误让我发疯,以至于我不得不关闭 Eclipse 错误分析功能。 我对你的回答投了反对票,但如果在此之后,自动完成功能有效,我会投赞成票。多年后,这个问题仍然困扰着我,每次都需要很长时间才能让它工作,通过执行随机清理、构建、关闭项目、构建索引、新文件等 这确实似乎是唯一的解决方法。多年后,我在 CCS(基于 Eclipse)中,很难找到,但这是让他们离开的唯一原因【参考方案3】:

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

窗口/首选项/C/C++/索引器。 取消选中“启用索引器”->>确定 全部重建,可能会显示很多错误 检查“启用索引器”->>确定 全部重建

这个错误可能是由于断电强制关闭eclipse而产生的。

【讨论】:

除了电源故障之外,还有更多可能的原因。当我将我的项目 repo 拉到具有较新版本 eclipse 的机器上时,这发生在我身上。 这行得通。但下次我会尝试 rt-click 项目、索引、重建。【参考方案4】:

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

这样就OK了!

【讨论】:

【参考方案5】:

您需要重建项目的索引。

右键单击项目,然后索引->重建。

【讨论】:

【参考方案6】:

更新: 您必须将正确的路径添加到 Project->Propoerties->C/C++ General->Paths and Symbols。如果没有帮助,您可以在 Project->Properties->C/C++ General->Code Analysis 中配置 Eclipse Code Analyzer(它会生成“错误”)。在您遇到问题的错误描述下,尝试自定义选定项->范围->排除模式。

【讨论】:

【参考方案7】:

IMO 正确的解决方案是在 Project -> Properties->C/C++ General -> Paths and Symbols -> Symbols 选项卡中定义符号。由于您可以假设该符号将始终由编译器提供,因此您只需告诉 Eclipse 将其视为已定义。

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

【讨论】:

【参考方案8】:

我认为这与工作空间/.元数据有关。 我报告了语义错误的问题,但 Hello World 编译并运行。 我删除了项目,创建了另一个项目,同样的错误报告。重新安装CDT,同样的事情。删除工作区,关闭 Eclipse,重新启动,创建新的 hello world,同样的事情。再次删除工作区,再次关闭Eclipse,这次注意到Eclipse在关闭时重新创建了工作区文件夹,但找不到。在 Eclipse 关闭的情况下删除了工作区。重新启动 Eclipse,创建硬件项目,错误显示大约一秒钟然后消失。删除项目,创建另一个项目,错误显示一秒钟,然后噗。 如果您的工作区中确实有项目(我的是全新​​安装),我敢打赌您可以删除工作区中的 .metadata 文件夹,它会修复它。

【讨论】:

这对我有用。删除整个 .metadata 文件夹(位于工作区的根目录),然后重新启动 eclipse。 file->import 当然是重新添加现有项目,我在工作区中没有设置任何重要的设置。 也在这里工作。刚重新导入项目,就报错了,心都凉了,但是cpu几个周期后,一切都好。【参考方案9】:

我个人同意 compostus 的回答。

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

但是当我尝试这些步骤时: 在 Project -> Properties->C/C++ General -> Paths and Symbols 中定义符号

我没有找到符号选项卡或任何添加符号的地方。我想要做的是将 -Dandroid 或 #define ANDROID 1 之类的宏放到 eclipse 中,以便代码分析器可以找到这个定义。

我在 Mac OSX 山狮下。

【讨论】:

__BASE_FILE__ 是预定义的 gcc 宏。我不想重新定义它:) 我遇到了同样的问题,多个选项卡没有显示,我在 Ubuntu 12.04 上运行 Eclipse 4.2.1 和最新的 CDT【参考方案10】:

添加为另一个答案,希望这会对某人有所帮助。

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

我将所有代码签出到一台新机器上,它构建良好,但在 std-c 和 std-C++ 代码上存在许多“语义错误”,包括.. 我检查了所有发现/索引器设置,但无济于事.

==> 删除整个 .metadata 文件夹解决了这个问题。

由于我在工作区中没有设置任何重要的东西(都在项目文件/makefile 中),eclipse 愉快地创建了一个新的工作区,我只需要做一个文件->导入->现有项目

【讨论】:

【参考方案11】:

如果在 Ubuntu 上,请转到窗口 > 首选项 > 在搜索框中键入“索引器”> 在左栏中选择索引器。 在标题“索引器选项”下勾选以下选项(除了那些涉及跳过文件的选项):

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

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

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

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

用户主动构建配置

【讨论】:

我在 Window > Preferences 和 project properties 中启用了所有索引器选项,除了那些用于跳过文件的选项,它解决了这个问题。【参考方案12】:

试试这个:

首选项 --> c/c++ --> 索引器 --> 索引所有标头变体

选中此选项。

【讨论】:

【参考方案13】:

这是一个文件索引问题。

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

(适用于 Eclipse CDT.Oxygen)

【讨论】:

【参考方案14】:

在我的例子中,我最终发现索引器有问题,因为一位同事“有帮助”在两个头文件中复制了整个声明负载,这些头文件只一起包含在项目中的 C 文件。删除重复项(并使一个标头包含另一个标头)允许索引器再次正常运行。

由于某种原因,重复枚举尤其成问题。我不知道为什么会这样。

【讨论】:

【参考方案15】:

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

---fileA.h---

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

---文件B.h---

#include "fileA.h"

---fileB.cpp---

#include "fileB.h"

MYMACRO(5)  <---- warning here

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

【讨论】:

【参考方案16】:

不确定这是否适用于 OPs 问题,但我在 eclipse Luna 中有语义错误,并且能够按照此线程中的说明解决它们:Eclipse shows unresolved inclusion but it compiles

编译器找到头文件,但 Eclipse 没有。

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

项目 -> 属性 -> C/C++ 构建 -> 设置 -> 编译器 -> 包括

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

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

问题是这样发生的:我在代码中的某处插入了一个新的变量名,例如本例中的“新人”:

int a;

foo()

  a=17;
  newone=23;

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

int a, newone;

foo1()

  newone=0;



foo()

  a=17;
  newone=23;

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

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

M.

【讨论】:

【参考方案19】:

过去,我会在以下位置定义 ANDROID 符号: 项目 -> 属性 -> C/C++ 常规 -> 路径和符号 -> #Symbols 选项卡 但是,最新版本的 Eclipse 不再有 # Symbols 那里或其他任何地方。 似乎不再有任何方法可以在 Eclipse 中定义符号。 Eclipse 有很多错误和问题。 终于放弃了,改用Gedit和终端编译。

【讨论】:

【参考方案20】:

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

#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。

【讨论】:

以上是关于Eclipse CDT 显示语义错误,但编译正常的主要内容,如果未能解决你的问题,请参考以下文章

将 gtkmm 与 Eclipse CDT 一起使用

Eclipse CDT 无法识别 Linux CLOCK_PROCESS_CPUTIME_ID

C++ opencv 编译错误 - Windows7 64-bit using Eclipse CDT

编译 C 程序后 Eclipse CDT 意外输出

Eclipse CDT 编辑器无法识别 OpenGL 扩展

使用 Eclipse CDT 创建凭据提供程序