一、makefile1.1makefile的基本了解会不会写makefile从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒,⼀个⼯程中的源⽂件不计数其按类型、功能、模块分别放在若⼲个⽬录中makefile定义了⼀系列的规则来指定哪些⽂件需要先编译哪些⽂件需要后编译哪些⽂件需要重新编译甚⾄于进⾏更复杂的功能操作简单来说就是工程上有很多xxx.c或xxx.cpp等源文件,如果我们一个个源文件都gcc xx.c xxx1.c… -o xxx.exe 的话就效率很低makefile就可以把多个源文件一起编译成可执行程序,然后通过make指令就能自动化编译1.2makefile的基本使用(1)它是一个普通文件,里面编写的代码是可以通过vim编写的,下面通过最简单的写法来揭开面纱这是最基本的写法:一条规则依赖关系依赖方法依赖关系: 就是目标文件的生成依赖于依赖单个文件或多个文件列表,就比如code.exe:code.c,意思为code.exe的生成依赖于当前目录已存在的源文件code.c依赖方法:面对要生成的目标文件而产生的shell指令或者其他软件的指令,比如这里的gcc code.c -o code.exe, 我要生成code.exe,那我要产生的方法就是用gcc编译code.c去生成code.exe这个可执行文件所以依赖关系和依赖方法是一对的,它们之间可以产生因果关系也可以互不关联,意思为你的·依赖方法可以是以生成目标文件作为目的而写的,也可以是不生成目标文件而形成的指令。只要依赖关系存在下面的依赖方法可以写任何指令但一般肯定是相互产生影响的依赖方法的命令要以tab缩进来写否则会报错1.3makefile的基本使用(2)make是一条指令,它默认的是执行第一条规则后面也可以跟目标文件,然后就会执行它那里的依赖方法(因为就是简单的指令就简单过了)伪目标:上面说的无强因果关系的规则一般用在这里.它是执行指令后不会生成目标文件,也就是不会在当前目录下生成文件,它一般用来做工程的清理工作,伪目标的用法分析:.phony:后面的为虚拟目标文件名可以是任意名字只是常用的是clean并且依赖关系的依赖文件可以是空,主要就是为了执行下面的指令,rm的清理工作,因为我们用的vs或其他编译器你运行了代码后再运行就会运行不了,叉掉黑框就能运行本质就是清理了生成的可执行文件1.4makefile的基本使用(3)上面的伪目标还有细节之处:你有没有发现你写的一条规则make之后再make一下就不能了而清理工作可以一直make clean但是你可以尝试去修改一下你的源文件代码,你再重新make之后又能了(不信可以试试)为什么呢?文件的属性:一个指令stat 普通文件 这个指令就能查询,比如我查看code.exe的文件属性最主要的就是我框起来的三个先讲Modify-文件内容修改时间先说结论跟这个属性有关gcc执行的命令是跟源文件修改时间和可执行程序的修改时间有关,画图更好理解touch 已存在的文件可以修改Modify的时间为使用这个指令的时间,所以相反如果touch code.c还是直接vim code.c进去修改内容也好都能让源文件的Modify可执行程序文件的Modify那就可以重新再gcc的命令会重新编译出新的code,exe覆盖旧的code.exe所以对于有依赖关系的规则:加PHONY:让make忽略源⽂件和可执⾏⽬标⽂件的M时间对⽐,直接执行下面的指令依赖关系为空:.PHONY是让make不去磁盘上找目标文件直接执行下面的指令,这样就是为了避免如果你当前目录有该目标文件,依赖关系为空的话就会认为该文件是最新的就不会执行下面的指令了,所以.PHONY和依赖关系为空通常是配套使用就是为了只执行下面的命令上面的依赖关系code.exe,加上.PHONY试一下Change属性变更(文件的权限等)时间更新Access常指的是⽂件最近⼀次被访问的时间。在Linux的早期版本中每当⽂件被访问时其atime都会更新。但这种机制会导致⼤量的IO操作。具体更新原则不做过多解释。1.5makefile的基本使用(4)makefile里的是对里面的内容做分析后再使用对应的依赖方法比如下面的例子:也就是说当发现某个规则的依赖关系不存在时不会立马结束报错,而是会把它存入个依赖方法栈里再去寻找⼀层⼜⼀层地去找⽂件的依赖关系直到最终编译出第⼀个⽬标⽂件。1.6makefile的拓展语法多个源文件的链接体会makefile的快捷,常用的语法比如 touch src{1…100}.c这样可以创建100个srcx.c的文件然后编写makefile文件:上面已经注释了对应的写法,这里也没有办法,就和学语言的语法一样要记注意点:上面为什么要把.c转为.o后缀再编译呢?因为这样不用所有的源文件重新编译只需要对应的修改了的源文件才要重新生成.o文件其他的源文件都是用旧的.o文件这样就提高了效率这步的需求是后面的这步需要对应的.o文件来形成可执行程序文件,但是当前目录下没有就会触发隐式规则去生成对应的.c文件去生成对应的.o文件再执行这条指令,后面的就是显示写把对应的.c生成.o文件这个是通用的代码,以后不管几个文件都能使用