我正在处理一个有 2 个文件夹的项目,目录树是:(工具是第二个文件夹)
project folder
makefile
queue.h
queue.c
node.h
node.c
tool
main.c
enrollment.h
enrollment.c
utility.h
utility.c
这就是我编写 makefile 的方式:
CC = gcc
COMP_FLAG = -std=c99 -Itool -Wall -pedantic-errors -Werror
Enrollment: tool/main.o tool/utility.o tool/enrollment.o queue.o node.o
$(CC) $(COMP_FLAG) tool/main.o tool/utility.o tool/enrollment.o queue.o node.o -o Enrollment
main.o: tool/main.c tool/enrollment.h
$(CC) $(COMP_FLAG) main.c
enrollment.o: tool/enrollment.c tool/enrollment.h tool/utility.h queue.h
$(CC) $(COMP_FLAG) enrollment.c
IsraeliQueue.o: queue.c queue.h Node.h
$(CC) $(COMP_FLAG) queue.c
node.o: node.c node.h
$(CC) $(COMP_FLAG) node.c
utility.o: tool/utility.c tool/utility.h queue.h
$(CC) $(COMP_FLAG) utility.c
但是当我使用
make
这是我得到的错误:
gcc -c -o tool/main.o tool/main.c
In file included from tool/enrollment.h:5,
from tool/main.c:1:
tool/utility.h:4:10: fatal error: queue.h: No such file or directory
4 | #include "queue.h"
| ^~~~~~~~~~~~~~~~
如何解决这个问题?
查看您的 makefile:
CC = gcc
COMP_FLAG = -std=c99 -Itool -Wall -pedantic-errors -Werror
Enrollment: tool/main.o tool/utility.o tool/enrollment.o queue.o node.o
$(CC) $(COMP_FLAG) ...
main.o: tool/main.c tool/enrollment.h
$(CC) $(COMP_FLAG) main.c
现在查看调用的编译命令:
gcc -c -o tool/main.o tool/main.c
那个编译命令根本不是你的食谱所包含的。旗帜在哪里?缺少标志是为什么事情不起作用。
他们为什么不见了?它们丢失是因为您要求 make 构建先决条件
tool/main.o
:
Enrollment: tool/main.o ...
但是你告诉 make 如何构建
main.o
:
main.o: ...
文件
tool/main.o
和main.o
显然不是一回事,所以当make寻找构建tool/main.o
的方法时,它会忽略你的规则,因为它是针对一些完全不同的目标。由于没有定义构建目标的规则,make 将使用其内置规则之一(它知道如何从各种不同类型的源文件构建目标文件)。但是当然,内置规则使用标准的 make 变量,如 CFLAGS
,它不使用你的特殊变量,如 COMP_FLAG
.
您还必须确保将正确的标志传递给编译器,以告诉它在哪里可以找到源代码并放置输出。你正在编译
main.c
,但是你告诉make你要编译tool/main.c
。什么是main.c
?你周围有一些旧文件吗?你也说过你会构建tool/main.o
,但是你的编译命令使用默认值,所以它只会写main.o
.
你需要做的是确保你的先决条件和你的目标是相同的,你的编译器命令会做正确的事情,所以而不是:
main.o: tool/main.c tool/enrollment.h
$(CC) $(COMP_FLAG) main.c
你必须写:
tool/main.o: tool/main.c tool/enrollment.h
$(CC) $(COMP_FLAG) -c -o tool/main.o tool/main.c
并且,对于
tool/utility.o
和tool/enrollment.o
目标也是如此。