Makefile初汇总

Makefile规则

Makefile常见规则

目标文件:依赖文件

      规则(命令)

eg:maintest:main.o input.o output.o

      gcc -o maintest main.o input.o output.o

每条命令前面是由TAB键开始,不能使用空格

Makefile的错误一般有两种:

  1. Makefile中的命令缩进没有使用TAB键。
  2. VI等编辑器使用空格代替了TAB键,修改文件etc/vim/vimrc,在末尾添加set noexpandtab语句,取消空格代替TAB键。

Make指令的执行过程

Make指令的执行流程:

一,      make指令会在当前目录下以makefile(Makefile)命名的文件。

二,      找到该命名的文件makefile(或Makefile),执行该文件中的命令,生成目标文件。

三,      如果目标文件不存在,或者目标文件没有依赖文件新(依赖文件有更新,目标文件没有更新),

会按照makefile中的命令,去生成目标文件。如果目标文件比依赖文件新,则这条makefile中对应的指令不执行。

(大工程下,只编译修改项目)。

Makefile语法

赋值语句有三种类型:

第一种:“=”。

第一种赋值,即时变量,当给变量执行赋值操作之后,马上生效。起作用的是最后一次对变量的赋值。

第二种:“:=”。

变量在该操作之前已经被赋值,变量取之前的赋值。

第三种:“?=”。

延时赋值。如果该变量之前被赋值,变量取之前的赋值。如果该变量之前没有赋值,变量赋值为该操作的赋值。

变量追加“+=”

此条语句针对字符串,对于变量是字符串。有需要在原来的字符串的基础上,添加新的字符串,需要用到此命令。如下所示:

objects = main.o input.o

objects += output.o

自动变量

通配符:%

通配符表示满足格式的任意字符。如下:

%.o:%.c 文件夹下(待)生成的.c文件依赖于文件夹下的.c文件。

自动变量:

$@:规则中的目标文件集合

$%:当目标是函数库的时候,表示规则中的目标成员名,如果目标不是函数文件,那么其值为空。

$<:依赖文件中的第一个文件。如果是以%.c来表示,$<表示一系列文件。

$?:所有比目标新的依赖文件目标集合

$^:所有的依赖文件集合。对于重复文件只会保留一份

$+:所有的依赖文件集合,但是其不会去除重复文件。

伪目标

在makefile中,目标都是要生成对应的文件。而伪目标不生成对应文件,不代表真正的目标名。执行make指令,通过伪目标来执行伪目标的指令,

避免makefile指令与工作目录下的实际文件出现名字冲突。

以clean指令为例,伪目标clean指令如下:

.PHONY:clean

避免与文件目录下的clean文件相冲突。如下所示(假设目录下有一clean命名的文件,冲突):

clean:

      rm *.o

posted @ 2022-08-04 20:01  JwChu  阅读(50)  评论(0编辑  收藏  举报