前言
makefile可以帮助我们自动化编译我们的代码,只需要通过make命令。make是个命令解释器,makefile是一个文件。以下简单介绍
提示:以下是本篇文章正文内容,下面案例可供参考
一、makefile
1.目标文件,依赖关系,依赖方法
目标文件是mybin,依赖条件是test.c,mybin和test.c 之间是依赖关系, 依赖方法是 gcc -o mybin test.c。简单理解为要生成目标文件,就先有test.c文件,然后在执行依赖方法,形成目标文件mybin. (多个依赖关系用空格隔开)
注意:对于依赖方法,前面的空格是Tab键隔开的!!!
(1)makefile依赖关系的推导过程
类似栈+,后进先出
make会当前目录下寻找makefile文件,找到文件中第一个mybin作为目标文件,寻找它的依赖关系mytest.o.但是执行依赖方法中并没有mytest.o而mytest.o文件依赖于mytest.i文件,于是向下扫描,直到它找到mytest.c通过执行mytest.i依赖方法,形成mytest.i文件,然后执行mytest.s的依赖方法形成mytest.s.......最后形成目标文件mybin.
2.关于目标文件和先决条件的时间戳
make第一次对源文件编译链接形成可执行程序,如果第二次make,它不会再去执行,需要更新源文件内容
本质是因为make执行的时候它会判断形成的依赖的时间戳是否比目标文件的时间晚,是的话就不去执行。因为你先决条件的那个文件内容都没被修改,再执行形成的目标文件还是相同的。
命令:stat 查看文件的状态。Modify记录文件的内容状态,Change是文件的属性
1.修改源文件的时间
touch +源文件。touch 对于存在的文件,会修改文件的时间戳,不存再就创建这个文件。
2.清理已经形成的.o文件
.PHONY是makefile的关键字,被修饰的文件称伪目标。可以认为它是总被执行的,不会有时间戳问题。
3.makefile允许定义变量
它的变量类似宏定义,可以替换 。好处是我们可以简化代码。
1.$@代表目标文件(mybin),$^代表源文件(test.c)。
它的好处是,如果我们目标文件和依赖被修改以后,在其他出现目标文件和先决条件自然而然就被替换成我们修改之后的了。
2.makefile中允许变量的定义。
通过$().
4.编译多个文件
如下我们要编译2个,我们直接将设置all为伪目标,依赖关系是要生成的文件,由于all作为第一个目标文件,make是默认选择第一个目标文件的,所以只要make就可以同时编译2个了,而且不用担心源文件的时间戳的问题。也许也有更好的方法哈。
.PHNOY:all
all:udpserver udpclient
udpserver:Main.cc
g++ -o $@ $^ -std=c++14
udpclient:UdpClient.cc
g++ -o $@ $^ -std=c++14
.PHONY:clean
clean:
rm -f udpserver udpclient