makefile基础知识学习篇2

Makefile 变量

跟 C 语言一样 Makefile 也支持变量的,先看一下前面的例子:
 main: main.o input.o calcu.o
         gcc -o main main.o input.o calcu.o
上述 Makefile 语句中,main.o input.o 和 calcue.o 这三个依赖文件,我们输入了两遍,我们
这个 Makefile 比较小,如果 Makefile 复杂的时候这种重复输入的工作就会非常费时间,而且非
常容易输错,为了解决这个问题,Makefile 加入了变量支持。不像 C 语言中的变量有 int、char
等各种类型,Makefile 中的变量都是字符串!类似 C 语言中的宏。使用变量将上面的代码修改,
修改以后如下所示:
示例代码 3.4.2.1 Makefile 变量使用


1 #Makefile 变量的使用
2 objects = main.o input.o calcu.o
3 main: $(objects)
4 gcc -o main $(objects)

  • 注释开头要
    用符号“#”,
  • Makefile 中变量的引用方法是“$(变量名)”

中我们在定义变量 objects 的时候使用“=”对其进行了赋值,Makefile
变量的赋值符还有其它两个“:=”和“?=”,我们来看一下这三种赋值符的区别:

  • 使用“=”在给变量的赋值的时候,是变量的真实值取决于它所引用的变量的最后一次有效值。
  • 为赋值符“:=”不会使用后面定义的变量.
  • “?=”是一个很有用的赋值符,curname ?= zuozhongkai,,如果变量 curname 前面没有被赋值,那么此变量就是“zuozhongkai”,
    如果前面已经赋过值了,那么就使用前面赋的值。

变量追加“+=”,有时候我们需要给前面已经定义好的变量添加一些字符串进
去,此时就要使用到符号“+=”。

将对应的.c 源文件编译为.o 文件,每一个 C 文件都要写一个对
应的规则,如果工程中 C 文件很多的话显然不能这么做。

通过模式规则我们就可以使用一条规则来将所有的.c 文件编译为对应的.o 文件。

%.o : %.c
        命令

“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的
文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。

C语言工程一个通用的makefile文件看我这篇文章C语言工程的通用makefile模板(干货!!!)

Makefile 自动化变量

每一次对模式规则进行解析的时候
都会是不同的目标和依赖文件,而命令只有一行,如何通过一行命令来从不同的依赖文件中生
成对应的目标?自动化变量就是完成这个功能的!

常用的三种:$@(目标集合)、$<和$^(所有依赖文件集合,空格隔开

1 objects = main.o input.o calcu.o
2 main: $(objects)
3         gcc -o main $(objects)

5 %.o : %.c
6         gcc -c $<


8 clean:
9         rm *.o
10       rm main

Makefile 伪目标,看我这篇文章makefile伪目标详解

Makefile 条件判断

语法有两种如下:


<条件关键字>
        <条件为真时执行的语句>
endif
以及:
<条件关键字>
        <条件为真时执行的语句>
else
        <条件为假时执行的语句>
endif


其中条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef,这四个关键字其实分为两对、ifeq 与
ifneq、ifdef 与 ifndef,先来看一下 ifeq 和 ifneq,ifeq 用来判断是否相等,ifneq 就是判断是否不
相等,ifeq 用法如下:
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数 1 >’,‘ <参数 2>’
ifeq “<参数 1>”, “<参数 2>”
ifeq “<参数 1>”, ‘<参数 2>’
ifeq ‘<参数 1>’, “<参数 2>”
上述用法中都是用来比较“参数 1”和“参数 2”是否相同,如果相同则为真,“参数 1”和
“参数 2”可以为函数返回值。ifneq 的用法类似,只不过 ifneq 是用来了比较“参数 1”和“参
数 2”是否不相等,如果不相等的话就为真。


ifdef 和 ifndef 的用法如下:
ifdef <变量名>
如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。“变量名”同样可以是
一个函数的返回值。ifndef 用法类似,但是含义用户 ifdef 相反。

makefile内置特殊变量“VPATH”,make会自动去找VPATH中的源文件

如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

Makefile静态模式

静态模式: :

targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。

target-parrtern是指明了targets的子集合,也就是真正的目标集

prereq-parrterns是目标集的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。 

$(OBJ):%.o:%.c
    $(CC) -c $(CFLAGS) $< -o $@

使用的就是静态模式,其中指明了我们的目标从$OBJ 中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“main.o fun.o”,
也就是变量$OBJ  集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“main fun”,并为其加下“.c”的后缀,
于是,我们的依赖目标就是“main.c fun.c”。
 

Makefile 函数使用

Makefile 支持函数,类似 C 语言一样,Makefile 中的函数是已经定义好的,我们直接使用,
不支持我们自定义函数。make 所支持的函数不多,但是绝对够我们使用了,函数的用法如下:
$(函数名 参数集合)
或者:
${函数名 参数集合}
可以看出,调用函数和调用普通变量一样,使用符号“$”来标识。参数集合是函数的多个
参数,参数之间以逗号“,”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“$”开
头。接下来我们介绍几个常用的函数,其它的函数大家可以参考《跟我一起写 Makefile》这份
文档。

1、函数 subst
函数 subst 用来完成字符串替换,调用形式如下:
$(subst ,,)
此函数的功能是将字符串中的内容替换为,函数返回被替换以后的字符
串,比如如下示例:
$(subst zzk,ZZK,my name is zzk)

把字符串“my name is zzk”中的“zzk”替换为“ZZK”,替换完成以后的字符串为“my name 
is ZZK”。


2、函数 patsubst
函数 patsubst 用来完成模式字符串替换,使用方法如下:
$(patsubst ,,)
此函数查找字符串(如果字符串中有空格,则认为是另外一个字符串)中的单词是否符合模式,如果匹配就用来
替换掉,可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果中也包涵“%”,那么中的“%”将是中的那个
“%”所代表的字符串,比如:
$(patsubst %.c,%.o,a.c b.c c.c)
将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字
符串为“a.o b.o c.o”。字符串是有空格分隔


3、函数 dir
函数 dir 用来获取目录,使用方法如下:
$(dir )
此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录
部分,比如:
$(dir /a.c>)
提取文件“/src/a.c”的目录部分,也就是“/src”。


4、函数 notdir
函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下:
$(notdir )
此函数用与从文件名序列中提取出文件名非目录部分,比如:
$(notdir /a.c>)
提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。


5、函数 foreach
foreach 函数用来完成循环,用法如下:
$(foreach , ,)
此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行所
包含的表达式。每次都会返回一个字符串,循环的过程中,中所包含的每个字符串
会以空格隔开,最后当整个循环结束时,所返回的每个字符串所组成的整个字符串将会是
函数 foreach 函数的返回值。


6、函数 wildcard
通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
$(wildcard PATTERN…)
比如:
$(wildcard *.c)
上面的代码是用来获取当前目录下所有的.c 文件,类似“%”。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Makefile 是一个用于自动化编译和构建程序的工具。它可以帮助开发人员管理项目中的依赖关系和文件的编译顺序,从而提高项目的编译效率和可维护性。 学习 Makefile 可以带来以下好处: 1. 自动化编译:通过 Makefile,我们可以定义编译规则和依赖关系,使得程序的编译过程更加自动化。只需要运行 make 命令,Makefile 将会根据文件的修改时间判断哪些文件需要重新编译,从而加快程序的构建速度。 2. 管理依赖关系:Makefile 支持定义不同文件之间的依赖关系,当某个文件被修改时,只有它的依赖文件也被修改了,才需要重新编译。这种管理依赖关系的方式可以减少不必要的编译时间,提高编译效率。 3. 支持多平台:Makefile 是跨平台的,可以在不同操作系统上使用。这意味着我们可以使用相同的 Makefile 来在 Windows、Linux、macOS 等多个平台上进行程序构建,而不需要为每个平台编写不同的构建脚本。 4. 高度可定制:Makefile 的语法相对简单,但非常灵活,允许开发人员根据项目的需求自定义规则。我们可以通过定义变量、宏、规则和命令等来构建一个适合自己项目的 Makefile,满足特定的编译和构建需求。 5. 方便协作开发:在多人协作开发项目时,使用 Makefile 可以统一编译和构建的方式,避免因为不同开发环境导致的构建问题。每个开发人员只需要按照 Makefile 中定义的规则进行编译,从而保证整个项目的一致性和可靠性。 总的来说,学习 Makefile 可以帮助我们更好地管理项目的编译和构建,提高开发效率和项目的可维护性。掌握 Makefile 的基本语法和原理,能够更好地适应大型项目的开发和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值