c - 如何使 Makefile 仅重新编译已更改的文件?

标签 c makefile recompile

我一直在努力让 make 只编译已编辑的文件。然而,我并没有取得太大的成功,所有的文件都被重新编译了。谁能解释一下为什么?

我的文件是:

main.c
a_functions.c

其中 ma​​in.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 规则以匹配。)

其他几点:

  1. 正如@paxdiablo 指出的那样,

    a_functions.o: a_functions.c a.h
    main.o: main.c main.h
    
  2. 将这些对象链接在一起没有意义,除非一个对象(可能是 main.o)调用另一个对象(可能是 a_functions.o) >), 所以我希望看到这样的依赖关系:

    main.o: a.h
    

    所以我怀疑你有一些错误的声明。

  3. 您声明了一个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/

相关文章:

x86 - 使用 LLVM 将 x86 代码重新编译为更快的 x86

windows - 我可以将 16 位 .exe 程序转换为 64 位 .exe 吗?

C、HTTP 1.1 和 Socket Send 的麻烦

c - 链表、指针和节点

c++ - 将变量形式 make 移植到 Cmake

linux - 原始 makefile 编译失败

c - 使用 makefile 将目标文件放入新目录时遇到问题

c - 在 xinu 中恢复中断 128 0x80

c - 4x4 矩阵的调试语句