You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解释这份用于对比排序例程的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:28:36