Urh*_*dur 9 c eclipse eclipse-cdt include
我遇到了包含文件的奇怪问题,以及Eclipse的构建过程和错误报告之间的明显脱节.我将给出重现此问题的详细步骤,以便我们尽快缩小原因范围.
Eclipse 3.7.1(Indigo SR1)适用于C/C++ Linux开发人员,Ubuntu 10.10 64位
这一切都始于我导入一个现有的项目"自己"做得很好:我认为Eclipse将大大有助于浏览文件并弄清楚它是做什么的.但是,#include在Eclipse的视图中,某些d系统头文件似乎没有正确的效果.这非常令人费解,在调查过程中,我设法在一个小沙盒中重现了这个问题.
第一步:File: New: C Project使用Hello World ANSI C Project示例创建一个新的C项目().参数是Executable: Hello World ANSI C Project/Linux GCC,其余Empty项目设置为Linux GCC,并GNU Autotools设置为Hello World ANSI C Autotools Project.称之为"你好".一定要自动生成makefile(高级设置,我相信这是默认设置).
第二步:调整包含路径.使用Project: Properties: C/C++ General: Paths and Symbols: Includes: GNU C,设置搜索路径/usr/local/include,/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include,/usr/include.第二条路径取决于您安装的gcc的确切版本.只要构建路径至少包括,这无关紧要/usr/include.
现在,如果你打开hello.c它,它看起来很简单,Eclipse非常高兴除了return EXIT_SUCCESS;,它无法解决EXIT_SUCCESS.替换EXIT_SUCCESS为零(0),Eclipse给出了全部清晰.选择Project: Build Project以生成可执行文件.
打开命令行窗口并深入查看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;
}
Run Code Online (Sandbox Code Playgroud)
你会收到错误int zz...:"Symbol 'SPLICE_F_MOVE' could not be resolved".如果您构建项目,您将在控制台视图中收到类似的错误:"error: 'SPLICE_F_MOVE' undeclared".
现在,如果您将序言更改为:
#define _GNU_SOURCE
#include <fcntl.h>
Run Code Online (Sandbox Code Playgroud)
你仍然int zz在线上(在编辑器中)得到错误,但项目将正确构建!您可以通过在先前打开的命令行窗口中运行二进制文件来确认这一点.这真是奇怪,因为考试/usr/include/fcntl.h将表明,它#includes ^ <bits/fcntl.h>,而后者头#define小号SPLICE_F_MOVE在由守卫块(和一堆别人的)#ifdef __USE_GNU(__USE_GNU获取#define如果d _GNU_SOURCE是#defined).为什么在地球上不是我们#define _GNU_SOURCE在工作空间视角中正确传播的?
所以这就是我的问题,简而言之:为什么编辑器(以及所有Eclipse CDT)报告错误(显然是拒绝正确处理包含),但底层构建成功了?
我有同样的问题,但甚至没有做任何复杂的事情来生成它——我只是做了一个您描述的类型的 hello world 项目,并得到了相同的错误。但请注意,就我而言,这可能是由于 cygwin 安装失败所致——例如,我遇到了有关未能包含 .h 文件的其他错误,完全删除/重新安装 cygwin 消除了这些错误,但“符号...无法解析”错误仍然存在。
然后我决定制作第二个这样的项目,它们都在“问题”视图中报告这样的错误,但只有其中一个项目实际上在编辑器中显示了带有下划线等的错误(!)