Skip to content

Makefile简介

Makefile是用于自动化构建项目的一种脚本文件,它通常与GNU make工具一起使用。通过Makefile,开发者可以定义项目中的源文件、目标文件、依赖关系以及构建步骤,从而简化编译、链接等构建过程。

Makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

Makefile带来的好处就是——“自动化编译”,一旦写好只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake、Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。

Makefile文件中会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。

Makefile的核心是

基本组成

  1. 变量:Makefile中可以使用变量来存储文件名、编译器选项等常用信息,以便在构建过程中重复使用。

  2. 规则:规则是Makefile的核心,它定义了如何生成目标文件(通常是可执行文件或库文件)。每个规则都包含一个目标、依赖项和命令序列。

    • 目标:要生成的文件名。
    • 依赖项:生成目标所需的其他文件。
    • 命令序列:用于生成目标的命令,这些命令在依赖项发生变化时会被执行。
  3. 注释:Makefile中的注释以#字符开始,直到行尾。

编写规则

  1. 目标定义:每个目标都对应一个文件名,后面跟着冒号和依赖项列表。依赖项可以是其他目标或源文件。

  2. 命令序列:在目标定义下方,使用缩进来表示该目标对应的命令序列。make工具会按照顺序执行这些命令来生成目标文件。

  3. 变量使用:在Makefile中,可以使用$(VARIABLE)的语法来引用变量。变量可以是用户自定义的,也可以是make工具内置的。

  4. 模式规则:模式规则允许你为一组文件定义相同的构建规则。这通常用于编译项目中的多个源文件。

  5. 条件语句:Makefile支持条件语句,允许你根据特定的条件来执行不同的构建步骤。

make主要解决两个问题

1) 大量代码的关系维护

大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护

把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译

2) 减少重复编译时间

在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间

优点

  1. 自动化:Makefile可以自动化项目的构建过程,减少手动操作。
  2. 可重用性:通过定义变量和模式规则,Makefile可以适用于多个项目或项目的不同部分。
  3. 可维护性:Makefile中的构建规则是明确的,有助于其他开发者理解项目的构建过程。
  4. 灵活性:Makefile支持条件语句和函数等高级特性,可以根据需要定制构建过程。

局限性

  1. 复杂性:对于大型项目,Makefile可能会变得非常复杂,难以理解和维护。
  2. 依赖性:Makefile中的目标之间存在依赖关系,这可能会导致构建过程中的一些不必要的复杂性。
  3. 跨平台性:虽然Makefile可以在多个平台上使用,但不同平台上的构建过程可能有所不同,需要针对不同的平台进行调整。

Makefile文件命名规则

makefileMakefile 都可以,推荐使用 Makefile

make工具的安装

shell
sudo apt install make

总之,Makefile是一种强大的工具,可以帮助开发者自动化项目的构建过程。然而,对于大型项目或需要跨平台构建的项目,可能需要考虑使用更高级的构建系统(如CMake)来替代Makefile。