请求解释这份用于对比排序例程的Makefile示例
这份排序例程对比工具的Makefile详解
咱们来一步步拆解这份Makefile,它的作用是构建一个用来对比不同排序算法的程序compare_sorts。下面我会把每个变量、每条规则的功能和逻辑都讲清楚:
一、变量定义:让配置更易维护
这些变量是Makefile的「配置中心」,把重复用到的路径、工具、参数抽出来,以后修改起来只动一处就行:
BASE = /home/blufox/base:项目的根目录,最终生成的可执行文件会放在这个目录的bin子文件夹里。CC = gcc:指定用GCC作为C语言编译器,这是Unix/Linux下的常规操作,方便后续更换编译器(比如换成clang)。CFLAGS = -O –Wall:编译参数,-O开启基础优化(让生成的程序跑得更快),-Wall开启所有警告提示(帮你揪出代码里的潜在问题,比如未初始化变量、类型不匹配这类小bug)。EFILE = $(BASE)/bin/compare_sorts:最终生成的可执行文件的完整路径,$(BASE)会自动替换成前面定义的根目录,所以最终路径是/home/blufox/base/bin/compare_sorts。INCLS = -I$(LOC)/include:头文件搜索路径,-I是告诉编译器去指定目录找头文件,这里指向系统级的第三方头文件目录/usr/local/include。LIBS = $(LOC)/lib/g_lib.a \:链接时需要用到的静态库,这里列了g_lib.a和h_lib.a两个库,都在/usr/local/lib目录下。末尾的\是换行续行符,把长命令拆成两行,让Makefile更易读。LOC = /usr/local:Unix/Linux系统的标准本地安装目录,通常用来放第三方库和头文件。OBJS = main.o another_qsort.o chk_order.o \ compare.o quicksort.o:编译过程中需要生成的所有目标文件列表,这些.o文件是对应.c源文件编译后的中间产物,最后会被链接成可执行文件。
二、核心构建规则:从源文件到可执行文件
1. 生成最终可执行文件
$(EFILE): $(OBJS) @echo “linking …” @$(CC) $(CFLAGS) –o $@ $(OBJS) $(LIBS)
这是Makefile的核心规则:
- 目标是生成
$(EFILE)(也就是最终的可执行文件),依赖是所有的$(OBJS)目标文件。意思是:只有当所有.o文件都存在,且对应的.c源文件或依赖的头文件比可执行文件新的时候,才会执行下面的链接命令。 @echo “linking …”:@的作用是让Makefile不输出命令本身,只打印提示内容,这里就是告诉用户「正在链接啦」,让终端输出更整洁。@$(CC) $(CFLAGS) –o $@ $(OBJS) $(LIBS):调用GCC把所有目标文件和静态库链接成可执行文件。$@是Makefile的自动变量,代表当前规则的目标(也就是$(EFILE)),所以-o $@就是指定输出文件为最终的可执行文件。
2. 编译生成目标文件
$(OBJS): compare_sorts.h $(CC) $(CFLAGS) $(INCLS) –c $*.c
这个规则是通用的编译规则,适用于所有.o文件:
- 所有的
$(OBJS)里的.o文件都依赖于compare_sorts.h头文件。也就是说,如果compare_sorts.h有修改,所有的.c源文件都会被重新编译,避免因为头文件更新导致的代码不一致。 $(CC) $(CFLAGS) $(INCLS) –c $*.c:编译对应的.c源文件生成.o目标文件。-c选项是告诉编译器「只编译,不链接」,只生成中间目标文件。$*是自动变量,代表去掉后缀的文件名,比如对于main.o,$*就是main,所以$*.c就是main.c——这样一条规则就能处理所有的源文件,不用每个.c写单独的编译命令,非常高效。
三、清理规则:一键清空中间文件
clean: rm *~ $(OBJS)
执行make clean的时候,这个规则会帮你清理编译过程中生成的垃圾文件:
rm *~ $(OBJS):删除所有以~结尾的临时文件(通常是编辑器生成的备份文件),以及所有的.o目标文件,让项目回到只有源文件和头文件的干净状态,方便重新编译或者归档项目。
额外小细节
- 当你直接敲
make命令时,Makefile会默认执行第一个规则(也就是生成$(EFILE)的规则),自动完成编译、链接的全流程。 - 变量的设计是为了可维护性:比如以后要换编译器,只需要改
CC变量;如果项目根目录变了,只改BASE就行,不用在整个Makefile里到处替换路径。
内容的提问来源于stack exchange,提问作者Jai Sipani
相关产品推荐
相关产品推荐

