让我们假设我有一些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
提前感谢任何帮助
答案 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
重新链接。