二.make,makefile
make/makefile是Linux项目自动化构建工具
其中make是一个命令,makefile是一个文件(这个文件当中所写的是依赖关系和依赖方法)
1.功能
既然这个make,makefile这么强大,那就让我们来一起探索一下吧
2.基本语法
1.快速使用
首先我们带大家快速使用一下makefile
我们先创建一个test.c
然后写了一个简单的hello world
然后我们touch一个Makefile
然后用vim写了两行
2.依赖关系和依赖方法
3.补充:编译的特性
但是现在有这么一种情况,再生成刚才的可执行程序之后,我再次make,make,make
也就是说它现在就不给我再去编译了
然后我修改一下这个test.c文件
我随便加上了几行hello world
然后我再去make一下
也就是说:
如果我没有改动源文件
那么make一次之后的每次make时都不会再去重新编译
4.补充:ACM时间
我们使用stat查看一下这个test.c的时间
它上面给我显示了三种时间:
Access : 文件的"最近"访问时间
Modify: 文件的内容的最近修改时间
Change: 文件的属性的最近修改时间
其中文件的属性包括:文件名,文件类型,文件权限(rwx,拥有者,所属组,Other,大小,等等等等)
你这个Modify好理解,Change也挺好理解,你这个Access的"最近"为什么要加双引号呢?
还有我这个比较到底是要比较那个时间呢?
我们先来探索一下第二个问题
1.具体比较的时间
首先我们先明确一点:
我们修改一个文件的内容是会影响到它的大小的,绝大多数情况下是会改变这个文件的大小的,无论是这个文件最后变大还是最后变小了
大小不变的概率很低
因此绝大多数情况下:改变这个文件的Modify时间时,这个Change时间也会随之变动
那么我们就用一下排除法吧:
我们先只去改变这个文件的Change时间和Access时间,然后看看这个文件会不会重新编译
首先我们先通过权限来改变Change时间
然后我们通过cat修改文件的Access时间
然后我们修改了一下这个文件的Modify时间
经过排除法,我们验证了只有修改Modify时间后,这个文件才会重新编译,其实我们想一下也完全可以理解,这里只是验证了一下
2.Access时间的特点
5.clean
然后我们回到make和makefile中,你这个make和makefile的确是能够让我进行快速便捷地编译形成可执行程序
但是如果我今天想要把我的这个可执行程序删除,你make和makefile能搞定吗?
当然可以啦
这就要用到clean了
然后我们make clean
然后我们make
发现clean的清理工作很成功
所以以后当我们想要
1.编译这个源代码生成可执行程序,只需要make
2.删除这个可执行程序,只需要make clean
那么如果我把clean放到前面会怎么样呢?
6.makefile扫描特性
怎么明明当我还没有mycmd这个可执行程序的时候
这个rm -f mycmd就能执行呢?
这里有一个小的知识点:
其实是因为我们加了-f选项
也就是说rm -f是不管你有没有mycmd这个文件我都会执行
如果你有,那么我强制删除,如果你没有,那我我执行了也相当于我什么都不执行
回到正题,为什么我现在make的时候不去给我编译源文件,反而给我删除可执行程序呢?
这就要说到makefile的扫描特性了:
那我现在就是想要编译源文件生成可执行程序,怎么办?
我们可以make mycmd来进行编译(其中这个mycmd就是我们想要生成的可执行程序的名字)
而这个clean也是我们自己起的名字,不过最好还是让他叫做clean就行
下面我们来验证一下:
我新建了一个目录test
这里我给这个想要生成的可执行程序随便起了一个名字wz
可见make,make clean成功运行
下面我把clean改了
总之:
我们再写makefile的时候,一般都是这样的:
1.clean放在后面,编译生成可执行程序放在前面
2.clean就让他叫做clean
3.想要编译就用make命令,想要清理可执行程序就用make clean命令
3.makefile语法补充
1…PHONY关键字
对于这个关键字:记住一点:总是被执行
怎么理解呢?
我们先用.PHONY来修饰一下我们这个可执行程序的编译
注意:在makefile中:注释使用#表示的
然后我们发现:
2.@ @ ^
下面一些makefile的拓展写法
这个和@和@和^是可以自动去推导的,类似于C++中的auto是可以自动推导类型的(我们可以这么理解,但是这两种语法完全扯不上边)
我们就可以理解为这是一种固定写法,没有为什么
然后我们make一下测试测试
发现的确成功运行了
3.变量
下面也是makefile的一种拓展写法
测试一下,发现正常运行
4.make和makefile语法理解(递归)
下面我们在这个依赖关系和依赖方法的上面来深层次的去理解一下make和makefile的执行逻辑
编写这个makefile,我们也可以这样去写
4.多文件的makefile的书写
你前面跟我提的makefile都是单文件的
那么多文件的情况呢?
下面我们写了fun.h fun.c test.c
成功运行
当然这里把.c改成.o,然后再去生成.o目标文件也是可以的
以上就是我们Linux基础环境开发工具的使用(二):动静态库的理解,make,makefile的全部内容,希望能对大家有所帮助!