我正在为我的程序“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
这是前/后:
无论出于何种原因,“干净”永远不会执行。有人可以告诉我为什么吗?我是makefiles的新手,所以我可能会犯一个我不知道的非常明显的错误。
答案 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