EclipseCDT、包含的系统头和底层C构建之间奇怪的分离
我在include文件方面遇到了一个奇怪的问题,Eclipse的构建过程和错误报告之间显然存在着脱节。我将给出重现此问题的详细步骤,以便我们能够尽快缩小原因 Eclipse3.7.1(IndigoSR1)面向C/C++Linux开发人员,Ubuntu 10.10 64位 这一切都是从我导入一个现有的项目开始的,该项目本身就“使”很好:我认为Eclipse在导航文件和弄清楚什么起作用方面会有很大的帮助。然而,在Eclipse看来,一些EclipseCDT、包含的系统头和底层C构建之间奇怪的分离,c,eclipse,include,eclipse-cdt,C,Eclipse,Include,Eclipse Cdt,我在include文件方面遇到了一个奇怪的问题,Eclipse的构建过程和错误报告之间显然存在着脱节。我将给出重现此问题的详细步骤,以便我们能够尽快缩小原因 Eclipse3.7.1(IndigoSR1)面向C/C++Linux开发人员,Ubuntu 10.10 64位 这一切都是从我导入一个现有的项目开始的,该项目本身就“使”很好:我认为Eclipse在导航文件和弄清楚什么起作用方面会有很大的帮助。然而,在Eclipse看来,一些#included系统头似乎没有正确的效果。这非常令人费解,在调
#include
d系统头似乎没有正确的效果。这非常令人费解,在调查过程中,我设法在一个小沙盒中重现了这个问题
第一步:使用Hello World ANSI C项目
示例创建一个新的C项目(文件:new:C项目
)。这些参数是可执行的:Hello World ANSI C Project/Linux GCC,其余的空项目设置为Linux GCC
,以及GNU Autotools
设置为Hello World ANSI C Autotools Project
。叫它“你好”。确保自动生成makefile(高级设置,我相信这是默认设置)
第二步:调整包含路径。使用Project:Properties:C/C++常规:路径和符号:Includes:GNU C
,将搜索路径设置为/usr/local/include
,/usr/lib/gcc/x86\u 64-linux-GNU/4.4.5/include
,/usr/include
。第二条路径取决于您安装的gcc的确切版本。这并不重要,只要构建路径至少包含/usr/include
现在,如果您打开hello.c
,它看起来非常简单,Eclipse非常高兴,除了返回EXIT\u成功代码>,无法解析退出\u成功
。用零(0
)替换EXIT\u SUCCESS
),Eclipse将清除所有错误。选择Project:buildproject
生成可执行文件
打开一个命令行窗口并深入到Eclipse工作区文件夹的hello/Debug
子文件夹。到达后,您可以使用/hello
行运行可执行文件
现在乐趣开始了。修改hello.c
以阅读其后半部分:
#include <fcntl.h>
int main(void) {
printf("Hello World!\n");
int zz = SPLICE_F_MOVE;
printf("zz (SPLICE_F_MOVE) is '%d'\n", zz);
printf("Bye World!\n");
return 0;
}
您仍然会在intzz
行(在编辑器中)上看到错误,但项目将正确构建!您可以通过在前面打开的命令行窗口中运行二进制文件来确认这一点。这真的很奇怪,因为对/usr/include/fcntl.h
的检查将显示它#include
s
,而后一个标题#定义s在一个由#ifdef\u USE\u GNU
保护的块中拼接
(和其他一组)(如果\u GNU SOURCE
是\define
d,那么\u USE\u GNU
就会得到\define
d)。为什么我们的\define\u GNU SOURCE
在工作区透视图中没有正确传播
简单地说,这就是我的问题:为什么编辑器(以及所有EclipseCDT)报告错误(显然是因为拒绝正确处理include),但底层构建成功了吗?我也有同样的问题,但我甚至没有做任何复杂的事情来生成它——我只是做了一个您描述的hello world项目,并得到了相同的错误。但是,请注意,在我的例子中,这可能是由于cygwin的错误安装造成的——例如,我有其他关于未能进入的错误包括.h文件,cygwin的完全删除/重新安装删除了这些错误,但“符号…无法解决”错误仍然存在
然后我决定做第二个这样的项目,他们都在“problems”视图中报告了这样的错误,但只有一个项目在编辑器中实际显示了带下划线的错误等(!)也许这个问题来自Ijndigo本身。你对最新的Indigo SR2也做过同样的尝试吗?我在eclipse bugzilla中打开了Indigo及其SR1的一些bug。我在使用GNU和不符合GNU的工具链交叉编译各种微控制器时遇到了类似的问题。CDT报告了很多错误,但实际构建过程中RK非常完美,即使所有标题都正确地位于项目设置中
问题在于CDT的运行方式与make system build不同。CDT是一个独立的词法分析器、解析器和预处理器,不使用您正在使用的工具链进行构建。一旦您将项目设置设置设置为将作为命令行参数生成的设置与您的构建工具相匹配,这通常可以正常工作,但太多了LChain通常将隐藏的隐式定义作为其编译器/预处理器本身的一部分。根据我的经验,隐式/隐式定义的文档通常是粗略和不完整的,这使得几乎不可能确定为给定的工具链设置了哪些定义(有时甚至依赖于构建选项)以及它们的含义。虽然看起来您已经设置了所有正确的定义,以达到您遇到问题的定义,但我通常会发现(尤其是GNU),您缺少了一些东西,这些东西会阻止交换机按照您期望的方式处理
当我调试类似的东西时,我首先确保在我的项目目录中找到任何标题,如果它们的名称与其他目录中的名称相匹配,然后我慢慢地开始将标题从标准include文件夹移动到我的项目文件夹。CDT在指示它所属的标题文件的可能版本方面做得不是很好首先,它会在您最不希望的时候拉取系统环境设置,但它会首先在项目文件夹中查找标题(如果您没有将项目设置中的系统标题路径设置为优先)。通过移动系统
#define _GNU_SOURCE
#include <fcntl.h>