Eclipse 3.7.0 Indigo 配合 CDT 显示许多虚假编译错误

21

我已将我的Ubuntu升级到11.10,然后Eclipse也升级到了带有CDT 8.0.1的3.7.0 Indigo版本。

接着出现了以下问题:

Eclipse错误

我已经包含了vector头文件,但编译器仍然提示“无法解析符号'vector'”。我还定义了#define int Comparable,但是Eclipse还是说“无法解析符号'Comparable'”等等......

尽管出现了很多错误,但编译仍然成功完成!

我试着使用g++编译代码,没有任何问题。


我找到了一些关于这个问题的链接,但是没有找到一个确定的解决方案。你有任何想法吗?编码时出现这些消息真的很烦人! - Matteo
1
@zonyitoo,我认为我的答案是正确的。您能否请审核一下,并标记是否同意? - Catskul
@zonyitoo - 如果有帮助到你的话,你应该接受其中一个答案。 - Matteo
8个回答

8
问题在于索引器的视角中缺少许多包含目录。以下内容对我有用,但可能会因为不同的设置而有所不同:
/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/

它们可以在项目>属性>C++包含路径中设置。

据推测,将来CDT的平台专业化将自动包括这些内容。我记得在某个地方读到过这个信息,但无法提供参考资料。


如果问题是缺少包含目录,那么“#include <iostream>”这一行也会被用红色下划线标出,显示为“未解析的包含”。从屏幕截图中我们可以看到这不是这种情况。 - Artem Pelenitsyn
找到顶层包含并不是问题,而是底层“位”深处的包含。如果你的Eclipse找到了“iostream”,但没有找到“iostream”本身包含的内容,它就不会将其下划线标出来。 - Catskul
好的,没错。在将所有这些内容添加到我的项目路径之后,错误数量大大减少了。但是仍然存在一些错误。例如“类型X没有这样的构造函数”,其中X是std :: vector、std :: map等等……存在C ++11功能方面的问题(例如“无法解析函数'bind'”)。 - Artem Pelenitsyn
可能是类似的问题。我可能错过了一些路径,因为我猜测需要什么。您可以继续跟随标头,直到看到一个下划线缺失的包含在顶部的文件,然后搜索 /usr/include 找到它。 - Catskul
@Catskul - 你能告诉我你对我提出的解决方案有什么看法吗?它是否有助于解决你的问题(如果你还有的话)? - Matteo

5
一次次的Eclipse崩溃,虚拟机或计算机甚至长达数个月的开发会磨损掉Eclipse存储所有内容的工作区的稳定性。检查<workspace dir>\.metadata目录,了解Eclipse在工作区生成和存储的内容。每次添加插件、升级插件或删除插件都会向您的工作区中放置并更改信息。证明这个问题通常出现在升级Eclipse之后。(在我的情况下是Indigo)。清理旧工作区最简单的方法是使用-clean命令行参数来运行eclipse.exe可执行文件。Eclipse帮助文档告诉我们这个命令的作用:如果设置为"true",则OSGi框架和eclipse运行时使用的任何缓存数据都将被清除。这将清除用于存储包依赖关系分辨率和eclipse扩展注册表数据的缓存。使用此选项将强制eclipse重新初始化这些缓存。

有三种方法可以使用-clean命令行参数:

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

步骤3的优点是,您可以保留该脚本并在每次清除工作区时使用它。

这个页面对我很有帮助!希望它也能帮助其他人。


2
在项目属性中,转到 C/C++ Build > Tool Chain Editor,勾选 Display compatible toolchains only,选择 Linux GCC 并点击应用按钮。
现在,如果您转到 C\C++ General > Paths and Symbols,您将看到添加了新的包含路径列表。如果您重新构建索引,错误消息应该会消失。

非常感谢您的提示。这解决了我的问题,尽管我已经添加了正确的包含路径,但无论出于什么原因索引器仍然没有找到正确的头文件。 - naich

1
代码分析导致了这个问题。它实际上并没有编译代码,只是进行一些静态检查以获得快速反馈。不幸的是,我不知道该如何修复它,我只是禁用了它。抱歉,我现在在工作中,所以我没有 CDT 在我面前,但我认为它应该是这样的:
Window > Preferences > C++ General > Code Analysis

前往那裡,取消所有框選來停用它。


5
这不是一个好答案。问题是为了解决问题而提出的,而不是隐瞒它。代码分析是开发中重要的工具。禁用它真的不是一个好主意。 - Vincent

1

我已将索引选项更新为活动构建配置,目前运行正常。

同时,我还从文件列表中删除了一些需要提前索引的文件。


1
当您创建一个C++项目(在我的情况下是从现有代码中)时,您必须将“索引器设置的工具链”设置为您使用的编译器(在我的情况下是“GNU Autotools Toolchains”)。之后,“路径和符号”将显示您的编译器包含文件的正确路径。错误将消失。此设置仅在创建项目期间有用,稍后设置不会有帮助。
在indigo 3.7.2版本(以及更高版本)中,重新索引后可以生效您的更改。Eclipse会要求“重新索引”。较低版本可能需要手动重新索引头标签等。

0

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

我使用了QT Eclipse集成与Helios(3.6.2),没有遇到任何大问题。我使用的是mingw 4.6.2,安装在c:\mingw。我想升级到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包含了不在mingw主要包含文件夹中的stdarg.h,所以我添加了第二个。但是,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++

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

所以,我想教训是,即使Eclipse没有将其视为未解决的包含文件,也要包括mingw下的每个包含路径。

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


0

好的,这是对我有用的方法:

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

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

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

  • 再次编译项目 - 完美地工作了

我无法解释这个情况 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接