【Linux系统编程】—— 自动化构建工具Makefile指南
【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 忽略源文件与可执行目标文件的时间对比,总是执行伪目标的命令。
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)。 依赖检查:
- 如果目标文件不存在或依赖文件较新,则执行命令生成目标文件。
- 递归检查依赖关系,直到满足所有条件。
错误处理:如果缺少依赖文件或命令失败,Make 会停止执行并报错。
文件依赖性示例: 如果 的修改时间较新,则重新生成所有依赖的文件。 如果目标文件不存在,则根据依赖规则逐层构建。
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)
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 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) |