错误:没有这个文件或目录 - C

4

在解读这个评论之后,

/***************** arrayImpl.c **************/

#include"list/list.h"

#if defined(ARRAY)
 ....
#endif

我在./Computing/list/arrayImpl.c中写入#include"list/list.h"以测试使用Computing/testList.c程序的Computing/list ADT,这里展示了连接

但是,list/arrayImpl.c无法找到list/list.h,如下所示,

PC ~/code_practice/Computing
$ gcc -Wall -g -DARRAY ./list/*.c testList.c -o testList
./list/arrayImpl.c:3:22: fatal error: list/list.h: No such file or directory
compilation terminated.
./list/linkedListImpl.c:3:22: fatal error: list/list.h: No such file or directory
compilation terminated.

在遵循该评论后,我如何理解这个错误?我是否误解了?


@Jean-FrançoisFabre 我已经编辑了我的查询,加入了 arrayImpl.c 代码。 - overexchange
2个回答

5

list.h和包含它的c文件在同一目录中。当您执行

#include "list/list.h"

编译器会在包含路径 + /list 中查找文件。例如,它将查找不存在的 list/list/list.h 文件。
因此,可行的方法是更改为#include "list.h" 或者
在命令行中使用 -I. 添加当前目录,这样 list/list.h 就在包含路径中了。
gcc -Wall -g -I. -DARRAY ./list/*.c testList.c -o testList

来自gcc搜索路径文档

-I. 和 -I- 与完全没有-I选项不同,并且对于‘<>’包含的行为不同于没有特殊选项的‘“”’包含。 -I. 搜索编译器当前工作目录中的头文件,这个目录可能与包含当前文件的目录不同。

没有提到包含路径包含启动gcc的当前目录。


我进行了许多测试,评论是错误的。请检查我的编辑,文件说明并没有提到当前目录。 - Jean-François Fabre
当gcc文档说:“这可能与包含当前文件的目录相同,也可能不同。”它的意思是,在这种情况下,包含当前文件arrayImpl.c的目录list是否正确? - overexchange
是的,没错。当前编译文件目录会自动添加到编译器搜索路径中,仅限于此次编译。除非使用<>来包含文件,这将告诉编译器不要包含当前编译文件目录。 - Jean-François Fabre

1
您需要添加包含文件目录 "list"。

https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

gcc -Wall -g -DARRAY ./list/*.c testList.c -I list -o testList

您需要从“#include“list/list.h”中删除“list”。因为当您写入此内容时,您告诉编译器在所有包含目录中搜索一个名为“list/list.h”的文件。但是“list.h”在“list”中。所以“list”是不必要的。

#include "list.h"

你可以这样做,但很丑陋

#include "../list/list.h"

$ gcc -Wall -g -DARRAY ./list/*.c testList.c -I list -o testList 给出了相同的错误。 - overexchange
@overexchange修正了我的错误。 - Stargateur

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