### Make 使用与makefile的编写 #### 一、Make 概述 - **make** 是一个自动化构建工具,主要用于组织和执行编译任务。 - **makefile** 是make的指令文件,它描述了如何构建软件项目的各个部分。 #### 二、Makefile文件介绍 ##### 2.1 规则的格式 - 规则定义了如何生成某个目标文件。 - 基本格式: ``` 目标 : 依赖 命令 ``` - 示例: ``` hello : main.o func.o gcc -o hello main.o func.o ``` ##### 2.2 一个简单的Makefile文件 - 示例: ``` CC = gcc CFLAGS = -Wall OBJS = main.o func.o hello : $(OBJS) $(CC) -o hello $(OBJS) clean : rm -f *.o hello ``` ##### 2.3 make处理Makefile文件的过程 - make读取一个或多个makefile文件中的指令。 - 分析依赖关系图。 - 执行必要的命令来更新目标文件。 ##### 2.4 使用变量简化Makefile文件 - 变量可以存储常用的命令或路径等。 - 示例: ``` CC = gcc CFLAGS = -Wall ``` ##### 2.5 让make推断命令 - make可以根据扩展名自动推断出构建命令。 - 例如,从`.c`到`.o`的转换。 ##### 2.6 另一种风格的Makefile文件 - 可以使用更复杂的结构来组织makefile。 - 包括使用宏和条件语句。 ##### 2.7 在目录中删除文件的规则 - `clean` 规则通常用于清理编译产生的临时文件。 - 示例: ``` clean : rm -f *.o hello ``` #### 三、编写Makefile文件 ##### 3.1 Makefile文件的内容 - 包括规则、变量声明和其他指令。 - 应当清晰地组织,便于维护。 ##### 3.2 Makefile文件的命名 - 默认情况下,make查找名为 `Makefile` 或 `makefile` 的文件。 - 可以通过 `-f` 参数指定其他文件名。 ##### 3.3 包含其他的Makefile文件 - 使用 `include` 指令可以引入其他文件。 - 示例: ``` include common.mk ``` ##### 3.4 变量MAKEFILES - `MAKEFILES` 变量包含了所有被包含的makefile文件的名称列表。 - 可用于跟踪依赖关系。 ##### 3.5 Makefile文件重新生成的过程 - 如果makefile文件本身发生变化,make将重新解析它。 - 这有助于确保makefile的更改被应用。 ##### 3.6 重载其他的Makefile文件 - 通过 `-f` 参数可以在命令行上重写默认的makefile文件。 - 示例: ``` make -f mymakefile ``` ##### 3.7 make读取Makefile文件的过程 - make按照指定的顺序读取makefile文件。 - 可以通过 `-f` 参数改变这个顺序。 #### 四、编写规则 ##### 4.1 规则的语法 - 规则的基本格式包括目标、依赖项和命令。 - 支持通配符和条件语句。 ##### 4.2 在文件名中使用通配符 - 通配符如 `*` 和 `?` 可用于匹配文件模式。 - 示例: ``` %.o : %.c $(CC) -c $< -o $@ ``` ##### 4.3 在目录中搜寻依赖 - `VPATH` 变量允许make在多个目录中寻找文件。 - 示例: ``` VPATH = src lib ``` ##### 4.4 假想目标 - 不代表真实文件的目标。 - 用于定义任务或标记。 - 示例: ``` all : hello world ``` ##### 4.5 没有命令或依赖的规则 - 只用于标记的目的。 - 示例: ``` .PHONY : clean ``` ##### 4.6 使用空目录文件记录事件 - 创建一个空文件作为完成某项任务的标志。 - 示例: ``` done : touch done ``` ##### 4.7 内建的特殊目标名 - `.PHONY`、`.PRECIOUS` 等特殊目标名用于控制make的行为。 ##### 4.8 具有多个目标的规则 - 规则可以有多个目标。 - 示例: ``` hello world : main.o $(CC) -o $@ main.o ``` ##### 4.9 具有多条规则的目标 - 同一目标可以有多个规则。 - 示例: ``` clean : rm -f *.o clean : rm -f hello ``` ##### 4.10 静态格式规则 - 用于定义一组相关的规则。 - 示例: ``` %.o : %.c $(CC) -c $< -o $@ ``` ##### 4.11 双冒号规则 - 双冒号规则表示一个目标有多个规则。 - 示例: ``` hello :: main.o func.o gcc -o hello main.o func.o ``` ##### 4.12 自动生成依赖 - 使用 `-M` 选项可以让make自动生成依赖信息。 - 示例: ``` gcc -MM -MF dep.mk main.c ``` #### 五、在规则中使用命令 ##### 5.1 命令回显 - 使用 `$(MAKE)` 调用另一个make实例。 - 示例: ``` sub-make : $(MAKE) -C subdir ``` ##### 5.2 执行命令 - 使用 `$(MAKE)` 可以递归地执行make。 - 示例: ``` $(MAKE) -C subdir ``` ##### 5.3 并行执行 - 使用 `-j` 选项可以让make并行执行多个命令。 - 示例: ``` make -j4 ``` ##### 5.4 命令错误 - 如果命令执行失败,make会停止后续操作。 - 可以通过 `-k` 选项继续执行其他命令。 ##### 5.5 中断或关闭make - 使用 `exit` 命令可以提前终止make的执行。 - 示例: ``` check : $(CC) -c test.c if [ $? -ne 0 ]; then exit 1; fi ``` ##### 5.6 递归调用make - 使用 `$(MAKE)` 调用make。 - 示例: ``` sub-make : $(MAKE) -C subdir ``` ##### 5.7 定义固定次序命令 - 使用 `order` 指令可以定义命令的执行顺序。 - 示例: ``` order clean : all ``` ##### 5.8 使用空命令 - 可以使用空命令来定义无实际操作的任务。 - 示例: ``` touch : touch $@ ``` #### 六、使用变量 ##### 6.1 变量引用基础 - 使用 `$` 符号引用变量。 - 示例: ``` CC = gcc ``` ##### 6.2 变量的两个特色 - 替换引用:`$(subst a,b,$(var))` 将变量 `var` 中的 `a` 替换成 `b`。 - 嵌套变量引用:`$(var1)` 中可以再次引用其他变量。 ##### 6.3 变量高级引用技术 - **替换引用**:修改变量值。 - **嵌套变量引用**:实现复杂逻辑。 ##### 6.4 变量取值 - 可以通过 `$()` 或 `$(var)` 获取变量值。 - 示例: ``` $(info $(CC)) ``` ##### 6.5 设置变量 - 在makefile中直接设置。 - 示例: ``` CC = gcc ``` ##### 6.6 为变量值追加文本 - 使用 `+=` 运算符追加文本。 - 示例: ``` CFLAGS += -g ``` ##### 6.7 override指令 - 可以覆盖已定义的变量。 - 示例: ``` override CFLAGS += -O2 ``` ##### 6.8 定义多行变量 - 使用 `\` 符号进行换行。 - 示例: ``` CFLAGS = \\ -Wall \\ -Wextra ``` ##### 6.9 环境变量 - make可以从环境变量中读取值。 - 示例: ``` $(info CC is $(CC)) ``` ##### 6.10 特定目标变量的值 - 可以为特定目标定义变量。 - 示例: ``` hello-CFLAGS = -DHELLO_WORLD ``` ##### 6.11 特定格式变量的值 - 根据目标文件的格式设置变量。 - 示例: ``` %.o-CFLAGS = -DDEBUG ``` #### 七、Makefile文件的条件语句 ##### 7.1 条件语句的例子 - 示例: ``` ifeq ($(CC),gcc) CFLAGS += -std=c99 endif ``` ##### 7.2 条件语句的语法 - `ifeq`、`ifdef`、`ifndef` 等用于条件判断。 - 示例: ``` ifdef DEBUG CFLAGS += -DDEBUG endif ``` #### 八、文本转换函数 ##### 8.1 函数调用语法 - 使用 `$()` 调用函数。 - 示例: ``` $(filter %.o,$(OBJS)) ``` ##### 8.2 字符串替换和分析函数 - `patsubst`、`subst` 等函数用于字符串操作。 - 示例: ``` $(patsubst %.c,%.o,$(SOURCES)) ``` ##### 8.3 文件名函数 - `basename`、`dirname` 等用于操作文件名。 - 示例: ``` $(basename $(notdir $(OBJS))) ``` ##### 8.4 函数foreach - 对列表中的每个元素执行相同的操作。 - 示例: ``` $(foreach obj,$(OBJS),$(info $(obj))) ``` ##### 8.5 函数if - `if` 函数用于条件判断。 - 示例: ``` $(if $(filter %.c,$(OBJS)),true,false) ``` ##### 8.6 函数call - `call` 函数用于调用其他函数。 - 示例: ``` $(call echo-list,$(OBJS)) ``` ##### 8.7 函数origin - 显示变量的来源。 - 示例: ``` $(origin $(CC)) ``` ##### 8.8 函数shell - 执行shell命令。 - 示例: ``` $(shell date) ``` ##### 8.9 控制Make的函数 - `wildcard`、`notdir` 等函数控制make的行为。 #### 九、运行make ##### 9.1 指定Makefile文件的参数 - 使用 `-f` 指定makefile文件。 - 示例: ``` make -f mymakefile ``` ##### 9.2 指定最终目标的参数 - 使用 `make target` 指定最终目标。 - 示例: ``` make all ``` ##### 9.3 代替执行命令 - 使用 `-n` 或 `--just-print` 只显示而不执行命令。 - 示例: ``` make -n all ``` ##### 9.4 避免重新编译文件 - 使用 `-t` 标志跳过未变化的文件。 - 示例: ``` make -t all ``` ##### 9.5 变量重载 - 使用 `make VARS=value` 重载变量。 - 示例: ``` make CC=gcc ``` ##### 9.6 测试编译程序 - 使用 `-B` 或 `--always-make` 强制重新编译。 - 示例: ``` make -B all ``` ##### 9.7 选项概要 - `make --help` 显示所有可用选项。 - 示例: ``` make --help ``` #### 十、使用隐含规则 ##### 10.1 使用隐含规则 - make根据文件扩展名自动应用规则。 - 示例: ``` %.o : %.c $(CC) -c $< ``` ##### 10.2 隐含规则目录 - make内置了一系列隐含规则。 - 可以查看文档获取完整列表。 ##### 10.3 隐含规则使用的变量 - `CC`、`CFLAGS` 等变量常用于隐含规则。 ##### 10.4 隐含规则链 - make可以尝试一系列规则来构建目标。 - 示例: ``` %.o : %.c %.o : %.cpp ``` ##### 10.5 定义与重新定义格式规则 ###### 10.5.1 格式规则简介 - 格式规则用于定义特定的转换。 - 示例: ``` %.o : %.c $(CC) -c $< ``` ###### 10.5.2 格式规则的例子 - 使用 `%.o : %.c` 来定义从 `.c` 文件到 `.o` 文件的转换。 ###### 10.5.3 自动变量 - `$<` 表示第一个依赖项。 - `$@` 表示目标文件。 ###### 10.5.4 格式匹配 - 使用 `*` 作为通配符。 - 示例: ``` %.o : %.c ``` ###### 10.5.5 万用规则 - 适用于多种情况的规则。 - 示例: ``` %.o : %.s %.o : %.cpp ``` ###### 10.5.6 删除隐含规则 - 使用 `%.o : ;` 来禁用特定的隐含规则。 ##### 10.6 定义最新类型的缺省规则 - 可以定义新的隐含规则。 - 示例: ``` %.o : %.java javac $< ``` ##### 10.7 过时的后缀规则 - 旧版本make支持的规则。 - 不建议使用。 ##### 10.8 隐含规则搜寻算法 - make根据文件扩展名顺序尝试不同的规则。 #### 十一、使用make更新档案文件 ##### 11.1 档案成员目标 - 使用 `ar` 工具管理档案文件。 - 示例: ``` libfoo.a : foo.o bar.o ar cr libfoo.a foo.o bar.o ``` ##### 11.2 档案成员目标的隐含规则 - make支持自动更新档案成员。 - 示例: ``` libfoo.a(bar.o) : ar r libfoo.a bar.o ``` ##### 11.2.1 更新档案成员的符号索引表 - 使用 `ranlib` 生成符号索引表。 - 示例: ``` libfoo.a(bar.o) : ar r libfoo.a bar.o ranlib libfoo.a ``` ##### 11.3 使用档案的危险 - 确保档案文件不会被意外覆盖或删除。 ##### 11.4 档案文件的后缀规则 - 可以定义特定的后缀规则来处理档案文件。 - 示例: ``` %.a : %.o ar cr $@ $< ``` #### 十二、GNU make的特点 - 支持复杂的依赖关系。 - 提供丰富的函数和变量。 - 支持并行构建。 #### 十三、不兼容性和失去的特点 - GNU make在不同版本之间可能存在不兼容性。 - 一些旧功能可能已被废弃。 #### 十四、Makefile文件惯例 ##### 14.1 makefile文件的通用惯例 - 使用一致的命名约定。 - 组织清晰的结构。 ##### 14.2 makefile文件的工具 - 使用 `include` 导入其他文件。 - 示例: ``` include config.mk ``` ##### 14.3 指定命令的变量 - `CFLAGS`、`LDFLAGS` 等用于指定编译选项。 ##### 14.4 安装路径变量 - `PREFIX`、`BINDIR` 等用于指定安装路径。 - 示例: ``` PREFIX ?= /usr/local BINDIR ?= $(PREFIX)/bin ``` ##### 14.5 用户标准目标 - `all`、`clean`、`install` 等标准目标。 - 示例: ``` all : hello ``` ##### 14.6 安装命令分类 - `install`、`uninstall` 等命令用于安装和卸载软件。 以上是对GNUMake使用及makefile编写的核心知识点的总结,这些知识点可以帮助开发人员更好地理解和使用make工具来自动化构建过程。

















剩余63页未读,继续阅读


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- fipaaaa_covid-19-test-system_13092_1755583793989.zip
- 分布式云服务与云计算管理平台_提供多模式云服务交付方案_支持软件模式_SaaS_PaaS_DevOps_IaaS_OpenStack等多种交付形态_面向第三方客户及内部研发团队_实.zip
- 专注圣经阅读与灵修成长的网页应用_提供屏幕常亮计时提醒默想引导护眼主题快捷键支持响应式设计本地存储性能优化_帮助基督徒建立规律读经习惯_提升灵修质量_适用于个人灵修.zip
- 零担货运管理专业版系统_货运公司托运单打印_货物装车到货状态跟踪_客户欠账还款管理_跟车人员工资计算_基础信息管理_托运登记查询_分单装运管理_货到确认处理_捎款登记审核_欠账还款.zip
- DPS快印店图文设计冲印店综合管理系统_快印店管理_图文设计_冲印业务_订单管理_生产调度_材料库存_财务管理_应收应付_员工工资_客户管理_供应商管理_机器工序管理_这是一款专为.zip
- 基于STC32微控制器的智能电磁循迹赛车系统_龙邱车模_宏晶STC32_高精度电感_编码器_陀螺仪_TOF测距_负重砝码_PID控制_上位机调试_OLED显示_电磁循迹_元素识别_.zip
- 广告制品全流程智能管理系统_广告制作_业务接单_设计审核_生产管理_安装完工_财务统计_客户管理_员工管理_欠款统计_利润分析_交货预警_基于宏达数据库信息管理开发平台_专为广告制.zip
- 电脑4S店综合管理系统_电脑销售维修库存财务一体化解决方案_适用于中小型电脑公司的进销存管理_商品进货销售退货查询_装机配置售后服务_库存盘点调拨管理_财务收支工资统计_固定资产管.zip
- 基于宏达数据库信息管理开发平台的房屋产权产籍全流程数字化管理系统_房产证登记审核缮证管理_初始登记转移登记抵押登记查封登记异议登记_费用审批业务受理统计查询_实现房地产权属登记全生.zip
- 基于STM32F407ZGT6的高精度航空发动机热障涂层厚度智能测量系统_热障涂层无损检测_航空发动机部件质量监控_涡流传感技术_高温环境自适应_非接触式测量_多传感器数据融合_实.zip
- 戒毒所人员信息管理系统_戒毒人员档案管理_入所出所信息登记_健康检查记录_法律手续办理_考核评估_分类查询统计_报表生成打印_数据导入导出_权限管理_日志记录_数据库压缩备份_行政.zip
- 纺织纺纱厂全流程智能管理系统_纺织企业ERP系统_原料管理_生产管理_销售管理_库存管理_工资管理_账务管理_统计查询_报表打印_设备维修_订单处理_发货登记_预警系统_供应商管理.zip
- 税务文书管理系统_基于宏达数据库信息管理开发平台开发的税务执法文书制作与管理系统_包含67种税务执法文书模板和审批流程_税务事项通知书_扣缴义务人登记表_财务会计制度备案_纳税人合.zip
- 基于宏达数据库信息管理开发平台的企业级库存管理系统_货品库存管理_入库出库登记_盘存管理_财务管理_短线超储预警_出入库统计查询_库存动态监控_物流资金周转优化_企业经营决策支持_.zip
- 卫生监督执法文书管理系统_基于卫生部2015年新规范设计的卫生行政执法文书生成软件_包含样品类文书_监督检察类文书_行政处罚类文书等完整文书模板_采用宏达数据库信息管理开发平台开发.zip
- 消防安全重点单位综合信息管理系统_消防档案管理_消防设施监控_消防预案编制_消防人员管理_防火统计报表_重点单位设置_监督检查记录_火灾隐患登记_灭火演练记录_应急疏散预案_消防安.zip


