makefile的规则

时间:2010-09-29 21:30:44

标签: unix makefile

让我们假设我有一些Unix的Makefile

prog:a.o b.o c.o
    gcc a.o b.o c.o -o prog
a.o:a.c a.h b.h
    gcc -c a.c
b.o:b.c b.h
    gcc -c b.c
c.o:c.c c.h b.h
    gcc -c c.c

我读到如果我更改* .c文件,我必须只重新编译这个文件,但如果我改变* .h文件,我必须重新编译所有依赖于我的* .h文件的文件,无论如何都要{{1}从头开始的所有文件

I must link让我们假设我只改变b.h,那么我需要做什么? 我的变体是1)我是对的吗?

make a.o b.o c.o让我们假设我只改变c.c,那么我需要做什么? 我的变体是2)我是对的吗?

最后如果我写make c.o例如我的makefile make c.o但是ONLY recompile c.o?我只有what about linker而不是gcc -c c.c

提前感谢任何帮助

2 个答案:

答案 0 :(得分:2)

你究竟是什么意思'我需要做什么?'。在每种情况下,只需运行make prog,让我们弄清楚,这就是重点。

编辑:如果你很好奇在每种情况下会做什么,假设你每次都在运行make prog,请继续阅读:

如果情况1)b.h已经改变,那么任何取决于它的东西(a.o,b.o和c.o)都将被重建,并且prog将被重新链接。

在案例2中)c.o只是c.c的直接依赖,所以只构建c.o并重新编译。

BTW,gcc可以通过在项目目录中运行gcc -MM *.c来为您提供依赖性。

答案 1 :(得分:1)

在所有情况下,你只需要

make prog

或只是

make

拥有Makefile的想法是make可以检查依赖关系,找出过时的内容,并执行所需的重新编译(而不是更多)。

如果您更改.c文件,显然它会重新编译该.c文件,并且因为这会更新.o所依赖的prog文件,它也会重新链接prog

如果您更改.h文件,则会触发重新编译一个或多个.c文件,这也会导致prog重新链接。