Makefile 编译与依赖关系:示例分析与问题解答
本教程通过一个包含七个源文件的示例程序,详细讲解 Makefile 文件的编写,并演示如何使用 make 命令进行编译,以及如何利用依赖关系优化编译过程。
程序源文件:
- 主函数 main_test.c
- 加法头函数 add.h
- int 类型加法函数 add_int.c
- float 类型加法函数 add_float.c
- 减法头函数 sub.h
- int 类型减法函数 sub_int.c
- float 类型减法函数 sub_float.c
Makefile 文件内容:
CC = gcc
CFLAGS = -Wall
all: main_test
main_test: main_test.o add_int.o add_float.o sub_int.o sub_float.o
$(CC) $(CFLAGS) -o $@ $^
main_test.o: main_test.c add.h sub.h
$(CC) $(CFLAGS) -c main_test.c
add_int.o: add_int.c add.h
$(CC) $(CFLAGS) -c add_int.c
add_float.o: add_float.c add.h
$(CC) $(CFLAGS) -c add_float.c
sub_int.o: sub_int.c sub.h
$(CC) $(CFLAGS) -c sub_int.c
sub_float.o: sub_float.c sub.h
$(CC) $(CFLAGS) -c sub_float.c
clean:
rm -f *.o main_test
编译过程:
在终端中执行 make 命令后,会先检查所有依赖项是否最新,如果有依赖项不是最新的,则会重新编译这些依赖项,最后重新链接生成可执行文件 main_test。
依赖关系:
- main_test.o 依赖于 main_test.c, add.h, sub.h
- add_int.o 依赖于 add_int.c, add.h
- add_float.o 依赖于 add_float.c, add.h
- sub_int.o 依赖于 sub_int.c, sub.h
- sub_float.o 依赖于 sub_float.c, sub.h
修改代码后重新编译:
如果修改了 main_test.c 里的变量值,再次执行 make 命令,会重新编译 main_test.o,因为它依赖于 main_test.c。其他源文件不会重新编译,因为它们的依赖项没有改变。
问题:makefile 文件中的 CFLAGS 变量是用来做什么的?
答: CFLAGS 变量用来指定编译器的参数,例如 -Wall 表示开启所有警告信息。在编译时,make 会将 CFLAGS 的值传递给编译器。
总结:
Makefile 文件通过定义依赖关系和编译规则来管理编译过程,可以有效地提高编译效率。CFLAGS 变量可以用来设置编译器的参数,控制编译行为。
原文地址: https://www.cveoy.top/t/topic/nVCD 著作权归作者所有。请勿转载和采集!