我一直在努力让 make 只编译已编辑的文件。然而,我并没有取得太大的成功,所有的文件都被重新编译了。谁能解释一下为什么?
我的文件是:
main.c
a_functions.c
其中 main.c 包含 main.h 并且 a_functions.c 包括 a.h
这是我的生成文件:
CC=gcc
CFLAGS=-Wall -I. -c
EXEC_FILE=program1
all: program
a_functions.o: a_functions.c
a_functions.c: a.h
main.o: main.c
main.c: main.h
objects: a_functions.c main.c
$(CC) a_functions.c main.c $(CFLAGS)
program: a_functions.o main.o
$(CC) a_functions.o main.o -o $(EXEC_FILE)
按照建议更改 makefile 似乎有同样的问题::
all: program
a_functions.o: a_functions.c a.h
gcc a_functions.c -c
main.o: main.c main.h
gcc main.c -c
program: a_functions.o main.o
gcc a_functions.o main.o -o program1
最佳答案
您正在谈论的具体问题——即使没有任何改变,也要重建 program1
(通过重新链接对象)——在这条规则中:
program: a_functions.o main.o
gcc a_functions.o main.o -o program1
这条规则的目标是程序
,Make假定它是一个文件。但是由于没有这个文件,所以每次运行Make时,Make都认为需要重建这个文件,然后执行规则。我建议这样做:
program1: a_functions.o main.o
gcc a_functions.o main.o -o program1
或者更好的是,这个:
program1: a_functions.o main.o
gcc $^ -o $@
或者更好的是:
$(EXEC_FILE): a_functions.o main.o
$(CC) $^ -o $@
(不要忘记更改 all
规则以匹配。)
其他几点:
正如@paxdiablo 指出的那样,
a_functions.o: a_functions.c a.h main.o: main.c main.h
将这些对象链接在一起没有意义,除非一个对象(可能是
main.o
)调用另一个对象(可能是a_functions.o
) >), 所以我希望看到这样的依赖关系:main.o: a.h
所以我怀疑你有一些错误的声明。
您声明了一个
objects
规则,但从不引用它。所以你从来没有真正使用过它; Make 使用%.o: %.c
的默认规则。我建议这样做:OBJECTS = a_functions.o main.o $(OBJECTS): %.o: %.c $(CC) $< $(CFLAGS) -o $@
(在这种情况下,您可以将
$(EXEC_FILE): a_functions.o main.o
更改为$(EXEC_FILE): $(OBJECTS)
。)或者只是这样:%.o: %.c $(CC) $< $(CFLAGS) -o $@
关于c - 如何使 Makefile 仅重新编译已更改的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7815400/