您现在的位置是:首页 >技术交流 >Linux下的项目自动化构建工具 —— make 和 makefile网站首页技术交流

Linux下的项目自动化构建工具 —— make 和 makefile

手捧向日葵的花语 2025-03-30 12:01:01
简介Linux下的项目自动化构建工具 —— make 和 makefile

目录

1.认识make和makefile

2.makefile的编写

依赖关系和依赖方法

.PHONY

变量


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文件中的内容较多,并且出现的内容重复度高,且经常变动,此时我们使用定义变量的方式会好很多;比如:如果需要修改文件内容的话,直接修改变量的值即可。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。