我如何制作Makefile仅重新编译已更改的文件?

问题描述 投票:58回答:3

我一直在努力使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
c makefile recompile
3个回答
75
投票

您正在谈论的特定问题-即使没有任何变化也要重建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规则以使其匹配。)

其他几点:

  1. 正如@paxdiablo指出的,

    a_functions.o: a_functions.c a.h
    main.o: main.c main.h
    
  2. main.o

    所以我怀疑您的声明有误。

    您声明了a_functions.o规则,但从不引用它。因此,您永远不会真正使用它; Make使用main.o: a.h 的默认规则。我建议这样做:

  3. objects

    ((在这种情况下,您可以将%.o: %.c更改为OBJECTS = a_functions.o main.o $(OBJECTS): %: %.c $(CC) $< $(CFLAGS) -o $@ 。或仅此:

    $(EXEC_FILE): a_functions.o main.o

12
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.