Clean指令在makefile中不起作用

时间:2014-02-14 13:34:03

标签: unix makefile

我正在为我的程序“p1”编写一个makefile,但我不能让我的“干净”工作。

#Default target
p1: main.o bst_insert.o bst_info.o
    gcc main.o bst_insert.o bst_info.o -o p1

#START Dependencies for default target
main.o: const.h bst_insert.h bst_info.h bst_struct_def.h main.c
    gcc -c main.c

bst_insert.o: bst_struct_def.h bst_insert.h bst_insert.c
    gcc -c bst_insert.c

bst_info.o: bst_struct_def.h bst_info.h bst_info.c
    gcc -c bst_info.c
#END Dependencies for default target

#Target for removing unnecessary files.
clean:
    rm -f *.o core

这是前/后:

make_before_after

无论出于何种原因,“干净”永远不会执行。有人可以告诉我为什么吗?我是makefiles的新手,所以我可能会犯一个我不知道的非常明显的错误。

2 个答案:

答案 0 :(得分:3)

如果你没有给它一个特定的目标来构建命令行,那么make将始终在makefile中构建第一个目标。它将通过检查所有先决条件及其先决条件等确保目标是最新的,并确保它们是最新的,然后构建目标(如果需要)。

除非您特别要求,否则不会构建任何不属于该树的目标。所以在这个例子中,clean不是第一个目标,它不是第一个目标的先决条件,所以它不是构建的。如果你想构建它,你应该运行make clean来请求构建它,或者你需要将它添加到先决条件列表中。但是,这样做很棘手,因为您希望它运行 last 。所以你需要做这样的事情:

clean: p1
        rm -f *.o

作为第一个目标。现在clean将会运行,但在此之前可能会发生p1,等等。

然而,这是非常不寻常的,不太可能是你想要的。拥有makefile的全部意义在于,您只需重新编译已更改的文件,而不必重新编译未更改的文件。如果每次都删除所有目标文件,那么每次运行make时都必须重新编译所有目标文件。

如果你总是希望每次都重新编译,那么make就没用了。您也可以编写一个shell脚本来编译代码,然后删除所有对象。

答案 1 :(得分:2)

您应该手动运行它:make p1 clean

此外,您的Make文件可能会短得多。

p1: bst_info.o bst_insert.o bst_struct_def.o
        gcc $^ -o $@

clean:
        rm -f *.o