linux-----makefile文件的编写
makefile文件的编写
说道makefile文件,想必大家在学习 linux过程中都会遇到,今天我们来讲讲makefile文件
先简单的说说makefile是什么?makefile项目代码的管理工具,管理程序的源代码;
那我们为什么要写出makedile呢,原因在于如果我们需要做一个项目,项目里面包含了100个甚至更多的源文件,我们都知道,源文件编程我们要的可执行文件,就得进行预编译,编译,汇编,连接过程,在liunx系统下,这个时候我们要得到结果,我们就需要一个源文件一个一个的进行语句编译汇编处理,那为了简便这个过程,于是就有了makefile文件的产生;
举个例子说明一下吧,我们可以看到当前目录下有两个文件,一个是比大小main.c,一个是计算器Calculator.c,我们要实现他们就得一个一个进行源文件-> .o文件,再由.o文件->可执行文件;
而有了makefile文件我们就可以这么编写:
那么我们可以清晰的看到执行make命令后,我们的两个文件都编译汇编好了
相信大家一定很感兴趣,这个makefile文件时怎么编写的
记下来说一下makefile文件编写的规则:
目标(target) : 需要的条件(dependencies) (注意冒号两边有空格)
命令(system command) (注意前面用tab键开头)
eg:我写的这个makefile文件:
我们看到这,有的小伙伴救问了,如果我的源程序很多,那岂不是要敲出很多这个执行语句;
那接下来我就告诉你们怎么优化这个代码:
我们可以看到我们可以给目标赋值,而$就是去除包含的文件的内容,我们也能知道当上面的目标没有得到满足的需要的条件,就会向下检索,一直找到需要的文件 比如生成target目标需要main.o和test.o所以下面出现main.o和test.o的目标代码;其他诸如此类当最终目标文件依赖多个.o时,将依赖的多个.o 一起写到main: 后面,然后依次以目标:依赖文件 gcc… 的格式,罗列所有依赖关系;
由于在上面的过程中生成了多个中间.o文件(实际工程中肯定是比较多的),所以每次编译完成,后续基本还需要进行一定的清理工作,这时候就用上一个 “clean” (后面细说一下)来清理。
我的虚拟机出现了点问题 就不能使用包含的例子向大家展示,大家可以在下面多多试试;
这段代码中增加了clean功能,可以把多余的.o 文件删除;
注意: .PHONY意思表示clean是一个“伪目标”。也即是无论clean是否最新,一定执行它。rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但并不理睬。当然,clean的规则不要放在文件的开头,否则这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”
其实还可以进行优化 但是我由于电脑的原因,知识点给大家理解:
从前面的makefile编写来看, 当中我们每写一个依赖关系就需要写一个形如gcc X.c -o X.o生成命令,这里还好,若是较大的工程,这样难免就太繁琐了,所以据了解,一般在公司专门编写makefile的人是不会那样写的。还有写着更简洁方式,就是利用下面这几个符号:
$^ 代表所有的依赖文件
aaa@qq.com 代表所有的目标文件
$< 代表第一个依赖文件
关于clean:
它只不过是一个动作名字,有点像c语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找它的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令(不仅用于clean,其他lable同样适用),就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个Makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
那么我们已经简单的会写makefile文件了,那么makefile文件时怎么运行的呢:
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“main”这个文件,并把这个文件作为最终的目标文件。
3、如果main文件不存在,或是main所依赖的后面的 .o 文件的文件修改时间要比main这个文件新,那么,它就会执行后面所定义的命令来生成main这个文件。
4、如果main所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o
文件生命make的终极任务,也就是执行文件main了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
推荐阅读
-
linux-----makefile文件的编写
-
关于PdfObject插件获取本地磁盘的文件
-
文件操作之文件中的内容转换为列表里面的字典
-
linux下修改文件的权限 (转载) 博客分类: Linux&Unix Linux
-
Java网络编程一个基础案例分析,基于TCP协议的客户端上传文件给服务器端(单线程版)
-
linux下修改文件的权限 (转载) 博客分类: Linux&Unix Linux
-
maven的pom.xml文件详解 博客分类: Maven mavenpom
-
SQL日志log的ldf文件太大时处理方法 博客分类: 数据库
-
基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码
-
无法为数据库"xxxx"中的对象'xxxx'分配空间,因为'PRIMARY'文件组已满 博客分类: 数据库 MongoDBPostgreSQL