make是linux中的自动化构建工具,一般来说系统会自带make,如果没有,那么可以使用命令“sudo apt install -y make”来安装。
1.初识make
make使用的前提是维护makefile/Makefile文件,需要在自己的目录下自己创建。
我在此目录下创建了一个Makefile文件和main.cpp的文件。main.cpp里面是打印“Hello World”的一段代码,那么先让我们见一见make和配置一下Makefile文件,让他帮我们编译代码吧。
在这里Makefile的格式是
target: dependencies command
在这里,target是目标,dependencies 是生成目标的依赖项,command是具体的实现方法,也就是说,第一行是依赖关系,第二行是依赖方法。
解读以上配置就是:要生成一个名为main.exe的文件,要生成这个文件是需要main.cpp文件,而生成main.exe的方法就是g++ -o main.exe main.cpp。在以上语法需要注意的是,依赖方法的前边一定是Tab开头,而不是空格。
先来看看这个能否构造出我们想要的文件吧:
可以看到,在使用make命令后它确实生成了我们想要的目标文件,在运行后也确实打印了“Hello World”,但是它会回显出我们的依赖方法这一段命令,为了解决这个问题可以在前边加一个“@”用来避免回显:
运行结果:
2.伪目标
伪目标在makefile中通常是用来给make的一些工具命令,它不依赖某些文件,通常会给伪目标用以关键字“.PHONY”修饰。其中“.PHONY”是告诉make,这个目标总是被执行,即:每次只要使用了这个目标,都会进行一次执行。细心的朋友可以多次使用make,这样的结果就是目标不总被执行:
在生成了我们想要的文件之后,我们可以使用伪目标来定义一个目标,来清理我们的文件:
在这里 .PHONY: clear是告诉make这个目标总被执行,下边的语法和上边讲的一样,只不过clear不依赖任何文件。
执行结果如图:
3.拓展的一些语法
在make中,又有一些十分有用的语法。在以下配置中:
main.exe可以使用“$@”来表示,main.cpp可以使用“$^”来表示。而且,在make中也有类似于宏的用法:
在以上配置里面,就拿第一行来说,dir代表#define中的第一个参数,main.exe代表第二个参数,其中使用这个变量的方法是$(变量)(第6行为例)。
a.编译多文件
然而,在编译文件的时候,肯定不止一个文件需要编译,那么怎么实现多文件编译呢?
那么先看一下实现配置:
在这里,第二行代表将以 .cpp 结尾的文件给src,然后在编译的时候就可以做到编译到每一个源文件:
这里可以看到将所有的源文件都给编译上了。
b.打包.o文件再编译
一般来说,在linux下一般都会将代码打包成.o文件,然后再统一进行编译,那么这个又该怎么做呢?
先看以下配置:
在这里,我用obj充当.o文件的集合,第三行后边的语法表示“将src里面以.cpp结尾的文件替换为以.o为结尾的文件,然后再赋值给obj”,这里的目的是为下边的配置做准备:
(1).将第八行的以.cpp为依赖文件替换为以.o为依赖文件。
第13行里,%类似于linux的通配符,而$<代表当前规则的第一个依赖文件名,即%.cpp
因为这里默认会把.cpp文件转换为同名.o文件,所以不用写其他语法。
执行后的结果:
生成了.o文件的同时,还生成了我们的可执行文件。这就是一个简单的make配置了。
4.注意事项:
在使用make和配置makefile的时候,需要注意空格的使用,在以上配置中:
我在第三行中第二个等号前后加上空格:
然后再次make:
然而没有生成.o文件,当我们去掉空格:
然后再执行:
有关于空格的注意事项以后再做补充,以上就是本文的全部内容。