只需触碰文件mod1.c
,make
就应该重新编译该源文件,生成其对应的目标文件 ,mod1.o
而不应重新编译mod2.c
,因为目标文件mod2.o
仍将完全保持最新状态(mod2.c
未触碰,但比 更旧mod2.o
,因此无需重新编译)。但我得到了以下行为:(
这不是个人创作,而是来自来源的书面示例[说明人们将见证如何知道未触碰并且不会重新编译它的make
文本])。make
mod2.c
Makefile
$ cat Makefile
SRC = mod1.c mod2.c main.c
OBJ = mod1.o mod2.o main.o
PROG = dbtest
$(PROG): $(OBJ)
gcc $(OBJ) -o $(PROG)
$(OBJ): $(SRC)
问题:
$ make
make: 'dbtest' is up to date.
$ touch mod1.c
$ make
cc -c -o mod1.o mod1.c
cc -c -o mod2.o mod2.c
cc -c -o main.o main.c
gcc mod1.o mod2.o main.o -o dbtest
文件内容
$ cat mod1.c
#include <stdio.h>
void foo() {
printf("Hello ");
}
$ cat mod2.c
#include <stdio.h>
void bar() {
printf(“World\n”);
}
$ cat main.c
#include <stdio.h>
void foo();
void bar();
int main (void) {
foo();
bar();
return 0;
}
问题出在这行:
扩展到
这意味着
mod1.o
,mod2.o
和main.o
依赖于mod1.c
,mod2.c
和main.c
,因此如果任何源文件发生变化,都应该重建所有三个。要获得您想要的行为,请删除该行:然后 Make 将使用其内置规则,该规则规定如果存在这样的文件,则给定的
.o
文件是从其等效文件构建的。.c