【Linux】自动化编译工具——make/makefile

📅 2026/7/15 3:22:07
【Linux】自动化编译工具——make/makefile
一.前言前文讲到Linux的基本指令和权限但是在我们常见的项目编译中肯定会有很多代码文件指挥使用指令是不够的所以本篇章着重来讲解一下如何使用Make/Makefile来实现项目的自动化构建在Linux中编译C语言代码a.out是从test.c经过预编译到test.itest.i经过编译到test.stest.s经过汇编到test.otest.o经过链接到a.out我们平常做做练习还可以接受但是到了大型工程可是有上千条上万条代码若是一次编译完成之后又修改了源代码接着又想进行编译此时便需要重新敲入指令那会使得工作量变得很大。可是在VS中我们可以无限地修改自己的代码然后随时编译运行不需要考虑这些复杂的原理那Linux中有没有这样的一站式操作呢那就是【make/Makefile】二.make/makefile介绍Makefile是干什么的Makefile是一个文件。它是一个工程文件的编译规则它记录了原始码如何编译的详细信息、描述了整个工程的编译链接等规则。Makefile带来的好处就是——“自动化编译。一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率target目标文件)文件1 文件2依赖文件列表 //依赖关系 Tabgcc -o 欲建立的执行文件 目标文件1 目标文件2 ///依赖方法 command ... ...target就是我们想要建立的信息一般称作目标文件。而后面的依赖文件列表就是具有相关性的object files也就是目标文件所依赖的文件可以是一个或多个也可以没有目标你想要生成的文件名比如最终的可执行文件或者中间的 .o 目标文件。也可以是一个执行动作如 clean。 依赖生成这个目标所需要的原材料源文件或其他中间文件。 命令如何将“依赖”变成“目标”的具体操作通常是 gcc/g 命令。 ⚠️ 致命易错点命令前面必须是一个纯正的 Tab 键缩进绝对不能是用空格代替否则 make 会报错三.makefile操作假设我们有一个简单的项目包含三个文件main.c (主函数) math.c (数学功能实现) math.h (头文件)传统编译方式gcc main.c math.c -o myapp使用 makefile 的方式在源码同级目录下创建一个名为Makefile或makefile的文件内容如下# 最终目标 myapp 依赖于 main.o 和 math.o myapp : main.o math.o gcc main.o math.o -o myapp # main.o 依赖于 main.c main.o : main.c gcc -c main.c -o main.o # math.o 依赖于 math.c math.o : math.c gcc -c math.c -o math.o工作原理依赖推导树当你输入make回车时make 会在当前目录找makefile并默认把找到的第一个目标也就是myapp作为最终目标。它发现要生成myapp依赖main.o和math.o。如果当前目录下没有这两个.o文件它会挂起当前任务继续向下寻找生成main.o和math.o的规则。找到底层的.c生成.o的规则后按从下往上的顺序先执行gcc -c生成目标文件最后再执行链接生成可执行程序myapp。这就是所谓的自动推导。四.进阶操作上面的写法有太多重复的内容比如文件名被写了好多次我们可以使用变量来简化它。常用自动化变量$表示规则中的目标文件。$^表示规则中的所有依赖文件以空格分隔。$表示规则中的第一个依赖文件。# 定义基础变量 CC gcc TARGET myapp OBJS main.o math.o # 链接生成最终可执行文件 $(TARGET) : $(OBJS) $(CC) $^ -o $ # 等价于 gcc main.o math.o -o myapp # 编译生成中间目标文件 # % 是通配符表示所有的 .o 文件都由对应的 .c 文件生成 %.o : %.c $(CC) -c $ -o $五.项目清理.PHONY伪目标编译过程中会产生很多中间文件如.o当你想清理工作区准备重新全量编译或打包源码时需要删除它们。我们通常会在 makefile 底部加上清理命令.PHONY:clean clean: rm-f $(OBJS) $(TARGET)为什么要有.PHONY关键字假设你的当前目录刚好有一个名为clean的实体文件当你执行 make clean时make发现目标文件clean已经存在并且它没有任何以来make就会认为它是最新的从而提示make‘clean is up to date,拒绝执行下面的rm命令。.PHONY的作用就是告诉makeclean是一个伪目标不代表具体的文件无论当前目录有没有叫clean的文件每次执行 make clean时无条件执行它下面的命令六.核心优势增量编译这也是 makefile 最大的价值所在只编译修改过的文件。如果你的项目有100个 .c文件你修改其中一个。当你再次输入make时make工具会对比源文件.c)和目标文件.o)的最后修改时间。如果发现xxx.c的修改时间比xxx.o晚它就知道源文件被改动过了于是只重新编译这一个文件然后重新链接。大大节省了大型项目的编译时间