Linux 高并发学习笔记 - Makefile 基本使用

1.4 Makefile 基本使用

Linux 高并发学习笔记 - 笔记索引

1.4.1 介绍

Makefile是一个用于便捷一键编译的工具。通过配置Makefile文件,使用make工具,可以迅速完成对于复杂项目的编译任务,不用每次键入如前文所述的多条Shell命令完成编译。

本章节将简单介绍Makefile的使用,满足基本需求。

关于Makefile的更多内容请见:

GNU make 官方文档

GNU Make 使用手册(中译版)_ZS_Wang_Blogs的博客-CSDN博客

1.4.2 基本语法
  • 特殊字符:
字符含义
$变量符
#注释符
*逻辑通配符
%模式匹配符
\转义符
  • 规则(核心):如下代码属于一条规则,一条规则通常是编译环节的一条命令。
<target>: <source list ...>  // <目标>: <依赖列表>   // <sourve list> 可以是空, 使用空格分割
	<shell command>          // 	<Shell 命令行>  // 注意:前方为 \t 而非空格
main: add.c sub.c mul.c div.c main.c
	gcc add.c sub.c mul.c div.c main.c -o main
  • 变量:

    • 自定义变量:
    <var>=<text>  // <text> 是一个字符串
    

    ​ 注意:Makefile中字符串没有""''包括,并且可以包含空格。Makefile中不区分数据类型,因为Makefile中只存在字符串数据类型。

    • 预定义变量:(常用)
    名称含义
    $@target / 目标
    $^source list / 依赖列表
    $<依赖列表的第一项
    main: add.c sub.c mul.c div.c main.c
    	gcc $^ -o $@
    
    • 引用变量
    var=text
    $(var)  // text
    
  • 函数:常用内置函数wildcardpatsubst

<var>=$(wildcard <text>)  // 将 var 赋值为通配表达式 text 的所有匹配路径的拼接
<var_dst>=$(patsubst <from>, <to>, <string>)  // 将 string 与 from 模式匹配并替换为 to 模式
src=$(wildcard *.c)
obj=$(patsubst %.c %.o $(src))
  • 伪目标:
.PHONY: <target>  // 将 target 设置为伪目标, 伪目标不会检查更新
.PHONY: clean
clean: 
	rm *.o *.a  // 清除编译中间件
1.4.3 工作原理
$ make  // 默认调用
$ make <target>  // 指定目标调用

注:在配置前调用make是非法的。

  1. 在工作目录中检查makefileMakefile文件,该文件是Makefile的配置文件。
  2. 调用目标规则。目标规则默认是Makefile配置文件中的第一个规则,也可以指定目标规则
  3. 检查规则依赖完整。Shell命令执行前首先检查相关依赖是否完整。如有依赖文件缺失,将首先递归加载依赖文件依赖文件加载规则在Makefile规则列表中查找。依赖文件加载规则为自上而下查找,这意味着你可以使用规则的优先级定义模式匹配依赖的加载。
  4. 检查目标是否需要更新。在完成以上步骤后,若经检查,目标文件已存在且依赖文件时间均早于目标文件,认为不需要更新,跳过此命令。因此,当项目中途修改Makefile文件时,你可能需要手动删除生成文件以重新编译。
  5. 经检查目标规则语法正确,依赖文件完整,目标文件不存在或需要更新,将执行Shell命令。
1.4.4 优化编译
  • 工作原理中讲到,Makefile具有检查依赖与更新的功能,可以充分利用检查与更新机制,局部编译,加速编译速度。

    例如,对比两段配置文件:

Makefile1

main: add.c sub.c mul.c div.c main.c
	gcc $^ -o $@

Makefile2

main: add.o sub.o mul.o div.o main.o
    gcc $^ -o $@

%.o: %.c
    gcc $^ -c -o $@
    
.PHONY: clean
clean: 
    rm *.o
  • 从项目长期看,认为Makefile2是优于Makefile1的。例如,我们需要向main.c中加入新的功能,此时无需重新编译add.c等文件,只需编译main.c与新增功能模块。或者,我们需要改写add.c 模块,只需重新编译add.c
  • 当然,如果需要,我们可以通过make clean清空编译中间件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值