我一直在努力使make只编译已编辑的文件。但是我没有取得太大的成功,所有文件都重新编译了。有人可以解释一下为什么吗?
我的文件是:
main.c
a_functions.c
其中main.c包括main.h并且a_functions.c包括a.h
这是我的makefile:
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
此规则的目标是program
,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
规则,但从不引用它。因此,您永远不会真正使用它; Make使用main.o: a.h
的默认规则。我建议这样做:
objects
((在这种情况下,您可以将%.o: %.c
更改为OBJECTS = a_functions.o main.o
$(OBJECTS): %: %.c
$(CC) $< $(CFLAGS) -o $@
。或仅此:
$(EXEC_FILE): a_functions.o main.o