【Linux】对于make/Makefile的编写
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
本文目录
背景简介
大家第一次写 hello world 程序的时候一定都记得在编辑完 helloworld.c 之后需要用 gcc 编译生成可执行文件然后再执行如果你不理解前面这段话请先自行搜索gcc 编译并理解相关内容。但如果你的项目由成百上千个 C 源文件组成并且星罗棋布在各个子目录下你该如何将它们编译链接到一起呢假如你的项目编译一次需要半个小时大型项目相当常见而你只修改了一个分号是不是还需要再等半个小时呢
- 一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefifile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作
- make是一个命令工具是一个解释makefifile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C++的nmakeLinux下GNU的make。可见makefifile都成为了一种在工程方面的编译方法。
- make是一条命令makefifile是一个文件两个搭配使用完成项目自动化构建
细说关于make命令和makefile文件
- makefile文件中保存了编译器和链接器的参数选项并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据然后根据规则调用编译器汇编器链接器产生最后的输出。
- Makefile里主要包含了五个东西显式规则、隐晦规则、变量定义、文件指示和注释
- 显式规则说明了如何生成一个或多个目标文件
- 在makefile中可以定义变量当makefile被执行时其中的变量都会被扩展到相应的引用位置上通常使用 $(var) 表示引用变量
- 文件指示。包含在一个makefile中引用另一个makefile类似C语言中的include
- 注释makefile中可以使用 # 在行首表示行注释
- make有自动推导的功能所以隐晦的规则可以让我们比较粗糙地简略地书写makefile比如源文件与目标文件之间的时间关系判断之类
- 默认的情况下make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件
- make的执行规则是只生成所有目标对象中的第一个当然make会根据语法规则递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象生成后退出。
使用方法
make 一个命令 makefile一个文件需在当前的源代码路径下 注Makefile/makefile 文件均可
makefile 是一个围绕依赖关系和依赖方法的一个自动化编译的工具
形成正确关系+正确方法
编写规则第一行是依赖关系目标文件对应的依赖关系文件列表可以为空第二行为依赖方法注意必须Tab一下编写
依赖关系
上面的输出文件myfile它依赖myfile.c
clean依赖关系的文件列表为空
依赖方法
gcc myfile.c -o myfilerm -f myfile
注
- 像clean这种没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行不过我们可以显示要make执行。即命令——“make clean”以此来清除所有的目标文件以便重编译。但是一般我们这种clean的目标文件我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是总是被执行的。
- makefile中使用 .PHONY 来声明伪对象
- .PHONY:总是被执行的冒号后面的命令总是被执行的
- makefile中的伪对象表示对象名称并不代表真正的文件名与实际存在的同名文件没有相互关系因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个1. 使目标对象无论如何都要重新生成。2. 并不生成目标文件而是为了执行一些指令。
- make 默认执行第一组依赖关系
为什么执行的指令是make和make clean呢
因为单独使用make 默认执行第一组依赖关系
如果后面还有其他依赖关系使用则需要make + 目标文件执行如make myfile / make clean
gcc如何判断文件是否需要重新执行
如何判断需要重新执行 : 通过对比时间信息来进行
make在执行makefile规则中根据语法规则会分析目标对象与依赖对象的时间信息判断是否在上一次生成后源文件发生了修改若发生了修改才需要重新生成
通过stat命令可以显示文件的状态信息Modify代表文件内容被修改的时间Change代表文件属性被修改的时间Access代表最后一次访问文件的时间
我们可以看到编译后的myfile文件可执行程序Modify时间比myfile.c(源文件)Modify时间更晚gcc通过识别比较源文件和可执行程序Modify时间判断是否需要重新编译。如果可执行程序显示时间更早说明源文件被修改了那就需要重新编译如果源文件显示时间更早说明可执行程序被修改过不需要重新编译。
本节完