跟我写makeFile<陈皓>
在探讨makefile编写方法前,我们首先要了解makefile是用于控制软件编译过程的一个配置文件,它是由一些规则、变量、函数以及条件判断等组成的文本文件。在Unix和类Unix系统中广泛使用,主要是用来自动化编译和链接程序,减少重复工作。本文以陈皓编写的《跟我写makeFile》为例,详细讲解makefile编写的各项知识点。 1. makefile基本概念 makefile文件中定义了一系列的编译规则,告诉make程序如何编译和链接程序。规则由目标(target)、依赖(dependencies)和命令(commands)组成,格式通常如下: ``` target : dependencies <tab>commands ``` target可以是一个文件名,也可以是一个执行的动作名称,如编译、清理等。dependencies是生成target所需要的文件列表,commands是一组由tab键开始的shell命令,用来创建或更新***t。 2. makefile规则详解 规则是makefile的核心,它指导make执行什么样的命令来更新目标文件。规则可以很复杂,也可以很简单。简单规则可以只有一个目标,复杂规则则可以有多个目标,或者依赖关系中包含了其他的规则。 2.1 makefile示例 一个简单的makefile示例可能包含如下内容: ``` all: main.o utils.o gcc -o program main.o utils.o main.o: main.c main.h gcc -c main.c utils.o: utils.c utils.h gcc -c utils.c ``` 上述示例中定义了三个目标:all(伪目标,不是文件名),main.o 和 utils.o。all是最终目标,它依赖于main.o和utils.o,所以当执行make all时,会首先检查main.o和utils.o是否需要更新,如果需要,则编译相应的源文件生成.o文件。 2.2 make的工作方式 make会检查文件依赖关系,判断文件是否需要重新生成,如果依赖的文件比目标文件更新,或者目标文件不存在,那么make会执行规则中的命令来创建或更新目标文件。makefile文件的第一行通常是包含另一个makefile文件的命令,这样可以使makefile模块化,易于维护。 2.3 使用变量 在makefile中使用变量可以简化规则定义,并提高可读性。变量定义的格式是: ``` variable = value ``` 然后可以在命令中通过$(variable)来引用变量的值。例如,我们可以把编译器命令定义为一个变量: ``` CC = gcc CFLAGS = -Wall ``` 然后在规则中使用: ``` main.o: main.c $(CC) $(CFLAGS) -c main.c ``` 2.4 自动推导功能 make程序能够根据目标文件的后缀来推导出需要执行的命令,这称为自动推导。通常当目标的依赖是“非标准”的时,就需要明确指定命令来告诉make如何更新目标文件。 2.5 另类风格的makefile makefile的风格可以多种多样,有传统的GNU make风格,也有更为简洁的风格,如imake或者cmake。不同的风格有着不同的语法规则和编写习惯。 2.6 makefile中的伪目标 伪目标并不指向任何文件,它们表示的操作是由make执行的,而不是创建文件。通常用于执行清理工作,例如: ``` clean: rm -f *.o program ``` 在上述例子中,`clean`是一个伪目标,执行`make clean`时,会删除所有.o文件和程序。 2.7 清空目标文件的规则 在makefile中也可以定义如何清空或删除目标文件,通常作为伪目标的一部分。 2.8 makefile的文件名 makefile的文件名通常是makefile或Makefile,make程序默认会在当前目录中查找这两个文件。 2.9 引用其它的makefile 在makefile中可以使用include指令来引入其它makefile文件,这样做可以让makefile更加模块化和可重用。 2.10 环境变量MAKEFILES 环境变量MAKEFILES可以指定一系列其它的makefile文件,make程序在执行时会将这些文件中的变量和规则合并到当前makefile中。 2.11 make的工作参数 make支持很多参数,如`-f`指定makefile文件名,`-n`显示将要执行的命令但不执行,`-s`静默模式不显示命令等。 3. makefile书写规则 makefile书写规则时有一些约定俗成的规则,比如用tab键缩进命令,使用空行分隔不同的规则等。 3.1 规则举例 具体使用时可以编写各种不同的规则,根据项目的需求定制编译和链接过程。 3.2 规则的语法 规则的语法是makefile编写的基础,需要掌握如何正确编写规则来控制make的行为。 3.3 在规则中使用通配符 make支持通配符来简化目标和依赖的描述,比如使用`*.o`代表所有的.o文件。 3.4 文件搜寻 makefile可以定义搜索路径来查找头文件和库文件,这样可以增强makefile的适应性和可维护性。 3.5 伪目标 伪目标是一种特殊的目标,它不对应实际的文件,通常用于执行一些特定的操作,如编译时的清理。 3.6 多目标 规则中可以定义多个目标,它们共享相同的依赖和命令。 3.7 静态模式 静态模式是一种特殊的规则语法,可以同时对多个相关文件应用同样的规则。 3.8 自动生成依赖性 makefile可以使用make的自动依赖生成功能,自动分析源文件之间的依赖关系。 4. makefile书写命令 makefile的命令部分是告诉make如何执行具体的任务,比如编译源代码、链接库文件等。 4.1 显示命令 命令前可以加上@符号,这样make在执行命令时不会显示该命令本身。 4.2 命令执行 makefile中的命令是由shell执行的,因此必须是有效的shell命令。 4.3 命令出错 如果命令执行失败,make会停止执行并返回错误代码,除非命令前加上减号(-),表示忽略错误。 4.4 嵌套执行make 在makefile中可以嵌套执行其他makefile文件。 4.5 定义命令包 可以将一组命令定义成一个命令包,然后在规则中直接调用,这样可以复用命令。 5. 使用变量 变量在makefile中非常重要,可以提高makefile的灵活性和可读性。 5.1 变量的基础 变量是简单的文本替换机制,可以在makefile中定义各种变量来存储编译选项、文件名等。 5.2 变量中的变量 变量可以嵌套,即变量的值可以是另一个变量的名称。 5.3 变量高级用法 变量还可以有附加的函数来处理其值,例如获取字符串长度、替换字符串等。 5.4 追加变量值 可以追加到变量的值的末尾而不覆盖原有的值。 5.5 多行变量 对于需要多行值的变量,可以使用特殊的语法来定义。 5.6 环境变量 makefile可以访问定义在环境中的变量。 5.7 目标变量 可以为不同的目标定义专门的变量。 5.8 模式变量 模式变量可以让make根据模式规则来选择特定的变量。 5.9 override指示符 通过override指示符,可以让make忽略环境变量对makefile中同名变量的影响。 6. 使用条件判断 makefile支持条件判断,可以基于条件来包含或排除某些规则。 6.1 示例 条件判断可以用来决定是否包含特定的makefile部分或执行特定的命令。 6.2 语法 条件判断的基本语法包括ifeq, ifneq,ifdef, and ifeq等。 7. 使用函数 makefile支持函数,可以动态地生成文本,执行操作等。 7.1 函数的调用语法 函数调用的语法通常是`$(function arguments)`。 7.2 字符串处理函数 makefile中的字符串处理函数包括subst, patsubst, strip, findstring等。 7.3 文件名操作函数 文件名操作函数可以获取文件路径的部分,如dir, notdir, suffix等。 7.4 foreach函数 foreach函数用于遍历列表中的每个元素,并为每个元素执行命令。 7.5 if函数 if函数可以根据条件执行不同的分支。 7.6 call函数 call函数用于执行一个参数化的函数。 7.7 origin函数 origin函数用于查询变量定义的来源。 7.8 shell函数 shell函数用于在makefile中执行shell命令,并获取输出。 7.9 控制make的函数 有一些函数可以用来控制make的行为,比如make的错误处理、回滚等。 8. make的运行 make命令的运行行为可以由不同的参数来控制,如指定makefile文件、目标、退出码等。 8.1 make的退出码 make命令执行完毕后会返回一个退出码,表示成功或失败。 8.2 指定makefile 可以通过`-f`选项指定特定的makefile文件。 8.3 指定目标 可以使用`target`参数指定make的目标,没有指定时默认为makefile中的第一个目标。 8.4 检查规则 `-n`选项可以用来检查规则,显示将要执行的命令,但不会真的执行。 8.5 make的参数 make支持很多参数,如`-C`改变工作目录,`-h`显示帮助信息等。 9. 隐含规则 make默认有隐含规则,可以简化makefile的编写。 9.1 使用隐含规则 可以不显式地写明规则,让make根据文件名自动推导。 9.2 隐含规则一览 make文档提供了隐含规则的列表,可以根据需要查看和使用。 9.3 隐含规则使用的变量 隐含规则使用了一些默认变量,如CFLAGS等,可以通过覆盖这些变量来自定义规则。 以上内容介绍了makefile的结构、规则、变量、函数、条件判断、运行方式以及隐含规则等基本知识点。学习并掌握makefile的编写可以帮助开发者提高软件编译的效率和可靠性。
剩余67页未读,继续阅读
- 粉丝: 1
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip