【问题标题】:Eclipse 3.7.0 Indigo with CDT shows many false compilation errors带有 CDT 的 Eclipse 3.7.0 Indigo 显示许多错误的编译错误
【发布时间】:2011-12-19 05:52:28
【问题描述】:

我已将我的 Ubuntu 机器更新到 11.10,然后 Eclipse 也已更新到带有 CDT 8.0.1 的 3.7.0 Indigo

然后出现以下问题:

我已经包含了向量头文件,但编译器说Symbol 'vector' could not be resolved。我也定义了#define int Comparable,但是Eclipse也说了Symbol 'Comparable' could not be resolved等等....

虽然出现很多错误,但编译成功!

我试过用g++编译代码,没有问题。

【问题讨论】:

  • 我发现一些links 谈论这个问题,但无法找到明确的解决方案。有任何想法吗?使用所有这些消息进行编码变得非常烦人!
  • @zonyitoo,我认为我的回答是正确的。能否请您查看并标记是否同意?
  • @zonyitoo - 如果对您有帮助,您应该接受其中一个答案。

标签: c++ eclipse eclipse-cdt


【解决方案1】:

问题是从索引器的角度来看,有一堆包含目录缺失。

添加以下内容对我有用,但可能取决于您实际存在的特定设置:

/usr/include/c++/4.6.1
/usr/include/                
/usr/include/c++             
/usr/include/c++/4.6         
/usr/include/x86_64-linux-gnu
/usr/include/asm-generic
/usr/include/c++/4.6.1/x86_64-linux-gnu/

可以在Project>Properties>C++ Include Paths中设置

大概在未来,CDT 的平台专业化将自动包含这些。我记得在某处读过,但无法提供参考。

【讨论】:

  • 如果问题是缺少包含目录,那么“#include ”行会用红色下划线表示:“未解决的包含”。在截图中我们可以看到并非如此。
  • 找到顶层包含的不是问题,而是底层的“位”包含在深处。如果你 eclipse 找到“iostream”但没有找到“iostream”本身包含的东西,它不会加下划线。
  • 好的,没错。在我将所有这些添加到我的项目路径之后,它大大减少了错误的数量。但也有一些人留下来。诸如“No such constructor for type X”之类的错误,其中 X 是 std::vector、std::map 等……C++11 功能存在问题(例如“无法解决函数‘绑定’”)。
  • 可能是类似的问题。当我猜到需要什么时,我可能错过了一些路径。您可以继续关注标题,直到在标题顶部看到带有下划线的包含缺失,然后搜索 /usr/include 以找到它。
  • @Catskul - 你能告诉我你对我提出的解决方案的看法吗?它是否能帮助你解决你的问题(如果你还有问题)?
【解决方案2】:

一次又一次 Eclipse、VM 或计算机崩溃,甚至只是几个月的开发,开始削弱 Eclipse 存储所有内容的工作区的稳定性。

检查<workspace dir>\.metadata 目录以了解Eclipse 在您的工作区中生成和存储了多少内容。每次添加插件、升级插件、删除在工作区中放置和更改信息的插件时。

一个证据是这个问题通常是在升级 Eclipse 之后出现的。 (以 Indigo 为例)。

修复尘土飞扬的工作区的最简单方法是使用 eclipse.exe 可执行文件的 -clean 命令行参数。

Eclipse 帮助文档告诉我们这个命令的作用:

如果设置为“true”,则 OSGi 框架使用的任何缓存数据和 eclipse 运行时将被清除干净。这将清除使用的缓存 存储捆绑依赖解析和 Eclipse 扩展注册表 数据。使用此选项将强制 eclipse 重新初始化这些 缓存。

可以通过三种方式使用-clean 命令行参数:

  1. 编辑位于您的 eclipse.ini 文件并将其添加为第一行的第一个参数。
  2. 编辑用于启动 Eclipse 的快捷方式并将其添加为第一个参数。
  3. 创建一个批处理或 shell 脚本,使用 -clean 参数调用 Eclipse 可执行文件。

第 3 步的优点是您可以保留脚本并在每次要清理工作区时使用它。

这个page解决了我的问题!希望它可以帮助其他人。

【讨论】:

    【解决方案3】:

    在项目属性中,进入C/C++ Build > Tool Chain Editor,勾选Display compatible toolchains only,选择Linux GCC并点击Apply按钮。

    现在,如果您转到 C\C++ 常规 > 路径和符号,您将看到添加的包含路径的新列表。如果您重建索引,错误消息应该会消失。

    【讨论】:

    • 非常感谢您的提示。这解决了我已经添加了正确的包含路径的问题,但是无论出于何种原因,索引器仍然没有找到正确的头文件。
    【解决方案4】:

    代码分析导致了这种情况。它实际上并没有编译代码,而只是进行一些静态检查以获得快速反馈。不幸的是,我不知道如何修复它,我只是禁用了它。抱歉,我正在工作,所以我面前没有 CDT,但我认为它类似于:

    Window > Preferences > C++ General > Code Analysis
    

    去那里并取消选中所有框以禁用它。

    【讨论】:

    • 这不是一个好的答案。提出问题是为了解决问题而不是隐藏它。代码分析是开发的重要工具。禁用它确实不是一个好主意。
    【解决方案5】:

    当您创建 C++ 项目时(在我的情况下是从现有代码),您必须将“用于索引器设置的工具链”设置为您使用的编译器(在我的情况下为“GNU Autotools Toolchains”)。 在此之后,“路径和符号”将显示编译器包含文件的正确路径。 错误将消失。 此设置仅在创建项目期间有用,稍后设置它没有帮助。

    在 indigo 3.7.2 版本(可能更高版本)中,您的更改可以在重新索引后生效。 Eclipse 要求“重新索引”。较低版本可能需要手动重新索引标题标签等。

    【讨论】:

      【解决方案6】:

      活动构建配置的更新索引选项对我有用,

      我还从预先索引的文件列表中删除了一些文件,

      【讨论】:

        【解决方案7】:

        好的,这对我有用:

        • 删除了我从包含路径创建的头文件的路径

        • 编译了项目(显然编译器会抱怨,因为它缺少用户定义的头文件)

        • 重新插入了我创建的头文件的路径

        • 再次编译项目 - 完美运行

        我无法解释这个案子:(

        【讨论】:

          【解决方案8】:

          我在这里回答是因为这是最接近我的问题的问题。

          我使用 QT Eclipse 与 Helios (3.6.2) 的集成,没有出现重大问题。我使用的是安装到 c:\mingw 的 mingw 4.6.2。我想升级到 Indigo,它解决了我在使用 CDT 时遇到的一些小问题。

          然而,在 Indigo (3.7 SR2) 下,Eclipse 开始强调琐碎的功能,因为没有解决,例如:

          function 'fprintf' could not be resolved
          function 'memset' could not be resolved
          

          即使#include 没有下划线,也可以打开,并将 fprintf 包含在标题中。即使代码本身编译得很好。

          如果我回到 Helios,问题就迎刃而解了。

          我尝试重新索引,但无济于事。我检查了我的包含路径,它们是:

          c:\mingw\include
          C:\MinGW\lib\gcc\mingw32\4.6.2\include
          

          起初,我只包含了第一个,但没有包含第二个。但是后来我搜索了“未解析的包含”,stdio.h 包含了 stdarg.h,它不在 mingw 的主包含文件夹中,所以我添加了第二个。但是,printf 仍然没有被解析,并且没有更多的“未解析的包含”。

          我用一个类创建了一个新的 C++ 项目。我添加了 stdio.h、上面的路径以及对 fprintf 的调用。有下划线!即使 stdio 中的其他内容没有下划线。

          现在我知道这不仅仅是一个 Qt 问题。

          在阅读此处建议删除包含路径并编译的底部帖子之前,我已经解决了一段时间。我不相信它会起作用,但试了一下。令人惊讶的是,即使编译失败,错误也消失了!

          就在那时,我再次查看了包含路径。它们已通过编译步骤更新为以下内容:

          c:/mingw/lib/gcc/mingw32/4.6.2/include-fixed
          c:/mingw/include
          c:/mingw/lib/gcc/mingw32/4.6.2/include
          c:/mingw/lib/gcc/mingw32/4.6.2/include/c++/backward
          c:/mingw/lib/gcc/mingw32/4.6.2/include/c++/mingw32
          c:/mingw/lib/gcc/mingw32/4.6.2/include/c++
          

          这些被标记为“内置”值,我认为这意味着它们不是我添加的,并且可以在我下次运行构建时更新。

          所以,我想教训是,包括 mingw 下的每一个包含路径,即使 Eclipse 没有发现它是一个未解决的包含。

          下一步是将所有这些路径放入我的 Qt 项目中。不幸的是,这样做之后,未解决的功能仍然存在。这似乎是 Qt C/C++ 包含路径与 CDT C/C++ 包含路径不同的某种错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-12
            • 2011-12-30
            • 2011-08-16
            • 2013-04-28
            • 2016-06-01
            • 1970-01-01
            • 2019-04-19
            • 1970-01-01
            相关资源
            最近更新 更多