【问题标题】:Eclipse CDT shows semantic errors, but compilation is okEclipse CDT 显示语义错误,但编译正常
【发布时间】: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 用红线和错误图标填充我的屏幕:)

我该如何解决这个问题?

【问题讨论】:

标签: eclipse gcc eclipse-cdt


【解决方案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。

                            【讨论】:

                              猜你喜欢
                              • 2018-07-28
                              • 2019-04-19
                              • 2013-03-14
                              • 1970-01-01
                              • 2016-06-02
                              • 2014-08-27
                              • 2014-08-06
                              • 2012-11-30
                              • 1970-01-01
                              相关资源
                              最近更新 更多