您现在的位置是:首页 > 编程 > 

【Linux系统编程】—— 自动化构建工具Makefile指南

2025-07-28 20:00:23
【Linux系统编程】—— 自动化构建工具Makefile指南 背景Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中,源文件的数量可能极多,这些文件会按照类型、功能或模块分布在多个目录中。Makefile 通过定义一系列规则,指定文件的编译顺序、依赖关系以及清理规则,从而实现自动化构建。使用 Makefile 的好处是显而易见的:自动化编译:只需运行 make 命

【Linux系统编程】—— 自动化构建工具Makefile指南

背景

Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中,源文件的数量可能极多,这些文件会按照类型、功能或模块分布在多个目录中。Makefile 通过定义一系列规则,指定文件的编译顺序、依赖关系以及清理规则,从而实现自动化构建。

使用 Makefile 的好处是显而易见的:

  • 自动化编译:只需运行 make 命令,即可完成整个工程的自动编译。
  • 高效开发:显著提高软件开发的效率。

Makefile 是配合 make 命令使用的文件,其中 make 是解释并执行 Makefile 中指令的工具。大多数 IDE 都支持类似的功能,例如 Delphi 的 make,Visual C++ 的 nmake,以及 Linux 下的 GU make。

将Makefile比作一个人月底的工资,那么一个人工资的各种组成计算就是Makefile的规则

基本使用

在云服务器当中我们可以创建一个文件比如 在文件当中写入

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
int main() 
{
    printf("hello Makefile!\n");
    return 0;
}

并且创建一个文件叫做Makefile/makefile两者都是可以的 并且打开vim进行写入

代码语言:javascript代码运行次数:0运行复制
code: 
	gcc -o code

.PHOY: clean
clean:
	rm -f code

依赖关系

  • 目标文件 code依赖于源文件 。
  • 编译命令:gcc -o code 。
  • 清理目标:通过 make clean 清理编译生成的目标文件。

项目清理

Makefile 通常会定义一个名为 clean 的目标,用于清理工程文件。由于 clean 不直接或间接依赖于第一个目标文件,因此需要显式执行:

代码语言:javascript代码运行次数:0运行复制
make clean

设置 .PHOY 伪目标可确保 clean 总是被执行:

代码语言:javascript代码运行次数:0运行复制
.PHOY: clean
clean:
	rm -f code

.PHOY 的作用

  • .PHOY 让 Makefile 忽略源文件与可执行目标文件的时间对比,总是执行伪目标的命令。
推导过程代码语言:javascript代码运行次数:0运行复制
test: 
	gcc  -o code

: code.s
	gcc -c code.s -o 

test.s: code.i
	gcc -S code.i -o code.s

test.i: 
	gcc -E  -o code.i

.PHOY: clean
clean:
	rm -f *.i *.s *.o code

编译过程 执行 make 命令时,按照以下步骤进行:

  • 预处理:gcc -E -o code.i
  • 汇编:gcc -S code.i -o code.s
  • 编译:gcc -c code.s -o
  • 链接:gcc -o code

Makefile 的工作机制

文件检测:Make 在当前目录中查名为 Makefile 或 makefile 的文件。 目标检测:读取 Makefile 的第一个目标文件(例如 myproc)。 依赖检查:

  1. 如果目标文件不存在或依赖文件较新,则执行命令生成目标文件。
  2. 递归检查依赖关系,直到满足所有条件。

错误处理:如果缺少依赖文件或命令失败,Make 会停止执行并报错。

文件依赖性示例: 如果 的修改时间较新,则重新生成所有依赖的文件。 如果目标文件不存在,则根据依赖规则逐层构建。

适度扩展语法代码语言:javascript代码运行次数:0运行复制
BI= # 定义变量  
CC=gcc 
#SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名 
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名 
OBJ=$(SRC:.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 
LFLAGS=-o # 链接选项 
FLAGS=-c # 编译选项 
RM=rm -f # 引⼊命令 
$(BI):$(OBJ) 
 @$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表 
 @echo "linking ... $^ to $@" 
%.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同
名.o
 @$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。 
 @echo "compling ... $< to $@" # @:不回显命令 
.PHOY:clean 
clean:
 $(RM) $(OBJ) $(BI) # $(RM): 替换,⽤变量内容替换它 
 
.PHOY:test 
test: 
 @echo $(SRC) 
 @echo $(OBJ)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-15,如有侵权请联系 cloudcommunity@tencent 删除系统makefile自动化编程构建工具

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1173199.html

相关标签:无
上传时间: 2025-07-21 12:02:25
留言与评论(共有 17 条评论)
本站网友 青春期的特征
20分钟前 发表
test test
本站网友 济宁住房公积金查询
6分钟前 发表
项目清理Makefile 通常会定义一个名为 clean 的目标
本站网友 月子吃什么
5分钟前 发表
clean clean
本站网友 索尼lt26w
21分钟前 发表
【Linux系统编程】—— 自动化构建工具Makefile指南 背景Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志
本站网友 上海达安花园
1秒前 发表
文件依赖性示例
本站网友 王振耀
26分钟前 发表
其中 make 是解释并执行 Makefile 中指令的工具
本站网友 额头高好吗
8分钟前 发表
用于清理工程文件
本站网友 面部吸脂整形
5分钟前 发表
Makefile 是配合 make 命令使用的文件
本站网友 东城区
23分钟前 发表
gcc -o code
本站网友 欧派象牙海岸
7分钟前 发表
代表依赖⽂件列表 @echo "linking ... $^ to $@" %.o
本站网友 大连婚庆
18分钟前 发表
$^
本站网友 重庆小康汽车控股有限公司
6分钟前 发表
适度扩展语法代码语言:javascript代码运行次数:0运行复制BI= # 定义变量 CC=gcc #SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式
本站网友 什么叫应用程序域
23分钟前 发表
test test
本站网友 邵武酒店
29分钟前 发表
将Makefile比作一个人月底的工资
本站网友 小乌鸦爱妈妈简谱
4分钟前 发表
推导过程代码语言:javascript代码运行次数:0运行复制test
本站网友 世茂百货
2分钟前 发表
.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 LFLAGS=-o # 链接选项 FLAGS=-c # 编译选项 RM=rm -f # 引⼊命令 $(BI)