您现在的位置是:首页 >技术交流 >Linux下的项目自动化构建工具 —— make 和 makefile网站首页技术交流
Linux下的项目自动化构建工具 —— make 和 makefile
目录
1.认识make和makefile
当我们在集成开发环境(Visual Studio 2019、CodeBlocks等等)下进行多文件的编程之后,想要将代码运行起来,直接一个运行键即可,非常的方便;但是,在Linux环境下,没有这些集成开发环境,我们想要将源文件编译形成可执行文件,就只能通过命令行的方式 使用gcc/g++等编译工具来进行编译,如果文件个数比较少,只有一两个,倒也无妨,如果文件的数量特别多的话,使用命令行逐个编译就显得费劲;于是,有大佬就开发了项目自动化构建工具 —— make。
make这个工具在启动的时候会去读取当前目录下的makefile文件中的内容。这个文件需要我们自己创建,相当于make的配置文件,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能;也就是说,makefile中的内容就表明了我们整个项目的构建步骤。
当make读取到makefile文件中的内容之后,会对makefile中的内容进行解析。也就达到了自动化编译的目的;也就是说,当我们在一个项目目录下写好一个makefile文件之后,只需要一个make命令,直接就能编译整个工程,极大的提高了开发效率。
所以:
make是一条命令,makefile是一个文件,两个搭配使用,共同完成项目的构建
2.makefile的编写
make是一个程序,在Linux中以指令的方式表现出来,这无需多言,所以,重点就放在了makefile这个文件的编写上。
依赖关系和依赖方法
在makefile文件中,我们最重要的就是表明依赖关系和依赖方法:
- 依赖关系:一般由目标文件和依赖文件列表组成,表明目标文件的形成需要依赖哪些文件;目标文件和依赖文件列表由冒号分割,冒号前面的表示目标文件,冒号后面的表示依赖文件列表。
- 依赖方法:依赖方法也就是我们在shell命令行输入的编译指令,表明依赖文件如何形成目标文件。
注意:
- 依赖方法前面不是空格,而是一个tab键。
我们会发现依赖关系和依赖方法中有重复的内容,他们都写了 code.c 和 code.exe,对于这个问题,我们可以使用 $@ 让make自动推导目标文件,$^ 让make自动推导依赖文件列表。
.PHONY
make在读取makefile形成目标文件的时候,默认是从上到下扫描makefile的,默认形成的是第一个目标文件,而且默认只能形成一个目标文件。
我们用code1.c文件和code2.c文件来做测试 并 编写如下makefile文件:
可以看到,默认只生成了第一个目标文件。
如果我们想要生成code2.exe文件,需要输入命令:make code2.exe:
如果我们定义了多个目标文件,那么使用命令:make 目标文件名 的方式生成目标文件就显得不太优雅,此时,我们可以使用 .PHONY 的方式定义伪目标。
我们定义一个伪目标叫做all:
- 第3行代码表明伪目标需要依赖的目标文件。
- 第4行和第7行代码表明依赖关系。
- 第5行和第8行代码表明依赖方法。
此时我们在shell命令行输入一个make,直接就能形成code1.exe文件 和 code2.exe文件:
变量
在makefile文件中,我们可以通过定义变量的方式来编写makefile文件:
- 定义变量的方式和C/C++类似,但是不需要指定类型。
- 使用变量的时候需要使用 $( ) 的方式,( ) 中需要指定使用的变量。
其本质类似于宏替换。
当我们输入make的时候,能够完成编译工作:
看到这里,有的人就要说了,定义变量的方式过于麻烦,不如直接写。我的建议如下:
- 如果makefile文件中的内容不多,并且不经常变动,确实可以不定义变量;
- 如果makefile文件中的内容较多,并且出现的内容重复度高,且经常变动,此时我们使用定义变量的方式会好很多;比如:如果需要修改文件内容的话,直接修改变量的值即可。