makefile目标规则

在Makefile中,变量后面带一个:和两个:的含义是不同的。

  • 一个:通常用于定义目标文件和它的依赖
  • 两个:则用于定义多目标规则

这是一个带一个:的例子:

target: dependencies
    commands

在这个例子中,target是目标文件,dependencies是它所依赖的文件或者其他目标,而commands则是生成目标文件所需要执行的命令。

而这是一个带两个:的例子:

targets:: dependencies
    commands

在这个例子中,targets可以是多个目标文件,它们共享相同的依赖和命令。这种规则被称为多目标规则。

需要注意的是,Makefile中的规则和变量是两个不同的概念。变量通常用于存储值,如文件名、编译器选项等,并可以在整个Makefile中引用¹。在定义变量时,我们通常使用等号(=)或冒号等号(:=),而不是冒号(:)。例如:

VAR = value  # 使用等号定义变量
VAR := value  # 使用冒号等号定义变量

在这里,等号(=)定义的是延时变量,只有在使用该变量时才会确定其值¹。而冒号等号(:=)定义的是立即变量,定义时就确定了该变量的值¹。这两种方式定义的变量在使用时可能会有不同的结果。例如:

x = before
y = $(x)_AAAA
x = later

xx := before
yy := $(xx)_AAAA
xx := later

all:
    @echo "$(x) = $(y)"
    @echo "$(xx) = $(yy)"

在这个例子中,如果我们运行make all,将会输出:

before = later_AAAA
later = before_AAAA

这说明,在使用等号(=)定义的变量时,它会展开为最后赋予它的值¹。而在使用冒号等号(:=)定义的变量时,它会展开为定义时赋予它的值。


在Makefile中,有许多常用的命令可以帮助我们自动化编译、打包、测试等操作,提高项目的管理和编译效率。以下是一些常用的命令:

  1. make:这是最基本的命令,用于执行Makefile文件中的规则。Makefile是由一系列规则组成的,每个规则由目标、依赖和命令三部分组成。make会根据这些规则,自动确定哪些文件需要重新编译,哪些文件不需要编译。

  2. clean:这个命令用于删除生成的目标文件。在编译过程中,我们会生成一些中间文件和目标文件,这些文件可能会占用较多的磁盘空间。使用clean命令可以清理这些文件,释放磁盘空间。

  3. all:这个命令用于生成所有的目标文件。通常,我们在Makefile中会定义多个目标,使用all命令可以一次性编译所有目标。

  4. install:这个命令用于将生成的文件安装到指定的目录中。在编译完成后,我们通常需要将生成的可执行文件或库文件安装到系统中,以便其他程序使用。

  5. uninstall:这个命令用于卸载已安装的文件。在安装完成后,我们可能需要卸载已安装的文件,例如进行版本回滚。

  6. depend:这个命令用于自动更新源文件的依赖关系。在大型项目中,源文件之间可能存在复杂的依赖关系,当一个源文件发生变化时,需要重新编译依赖于它的所有文件。使用depend命令可以自动更新依赖关系,避免手动维护依赖关系。

  7. 自定义命令:除了上述常用命令外,Makefile还支持自定义命令。例如,我们可以定义一个命令来运行项目的测试。

以上是常用的Makefile命令,使用这些命令可以大大提高项目的管理和编译效率。另外,Makefile还支持循环、条件语句等高级特性,可以根据需要灵活使用。

你可能感兴趣的:(我的博客,makefile)