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 显示语义错误,但编译正常的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse CDT 无法识别 Linux CLOCK_PROCESS_CPUTIME_ID