带有 2 个文件夹错误的简单 makefile

问题描述 投票:0回答:1

我正在处理一个有 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"
      |          ^~~~~~~~~~~~~~~~

如何解决这个问题?

c makefile
1个回答
0
投票

查看您的 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
目标也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.