欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

关于Makefile的学习

时间:2023-07-29

Makefile规则

一个简单的Makefile文件包含一系列的“规则”,其样式如下:

目标(target)...依赖(prerequiries)

命令(command)

目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,诸如`clean’。

依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。

命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。

目标 :依赖1 依赖2 ...

当“目标文件不存在“,或某个依赖文件比目标文件”新“,则执行”命令“

注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。这是容易出错的地方。

通常,如果一个依赖发生了变化,就需要规则调用命令以更新或创建目标。但是并非所有的目标都有依赖,例如,目标“clern”的作用是清除文件,它没有依赖。

规则一般是用于解释怎样和何时重建目标。make首先调用命令处理依赖,进而才能创建或更新目标。当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。

一个Makefile文件可以包含规则以外的其他文本,但一个简单的Makefile文件仅仅需要包含规则。虽然真正的规则比这里展示的例子复杂,但格式是完全一样的。

Makefile的简单使用

a.通配符 :   %.o

       $@ 表示目标

       $< 表示第一个依赖文件

       $^ 表示所有的依赖文件

        ...仅列出几个常用的通配符

b.假象目标:

执行make[目标](若没有目标执行就执行第一个目标)

例如该txt文件下的Makefile的例子 在Linux下运行 make 则相当于运行 make test !

当文件夹内存在与Makefile内规则要生成的文件同时存在时,Makefile将不会执行该规则。

例:如下列代码所示 文件下存在clean文件,但是我的Makefile想执行clean规则,这里冲突了clean规则将不会被执行!

所以引入 PHONY 假象目标来解决上诉问题

test:a.o b.o c.ogcc -o test a.o b.o c.o%.o : %.cgcc -c -o $@ $

c.即时变量、延时变量,export

简单变量(即时变量)

A := xxx         #A的值即可确定

B = xxx          #B到使用时才确定

:= #即时变量

= #延时变量

?= #延时变量,如果是第一次定义才有效,如果在前面该变量已定义则忽略这句

+= #附加,它是即时变量还是延时变量取决于前面的定义

A := $(C)B = $(C)C = abcall:@echo $(A)@echo $(B)

运行结果 

运行make指令,C为空。

A := $(C)该指令使用时A的值被确定为C,因此打印出空字符

而B = xxx指令是当该指令运行时才确定B被赋予的值,即输出C的最终结果!C的最终结果为abc

常用函数

$(filter pattern...,text)

把text中符合pattern格式的内容,filter(过滤)出来、留下来。

$(wildcard pattern)

pattern所列出的文件是否存在,把存在的文件都列出来。

$(filter-out pattern...,text)

把text中符合pattern格式的内容,filter-out(过滤)出来、扔掉。

$(patsubst pattern,replacement,text)

寻找`text’中符合格式`pattern’的字,用`replacement’替换它们。`pattern’和`replacement’中可以使用通配符。

以上函数用一个实例来表示

A = a b cB = $(foreach f, $(A), $(f).o)//将A中的值全部转化为.o格式C = a b c d/D = $(filter %/, $(C)) //将C中有/的值赋给DE = $(filter-out %/, $(C))//滤除C中含有/的值并赋值给E,即将C中除了/以外的值都赋给Efiles = $(wildcard *.c) //查询文件夹中是否含有.c文件并赋值给filesfiles2 = a.c b.c c.c d.c e.c abcfiles3 = $(wildcard $(files2))//查询该文件夹下是否存在file2s里面存在的文件dep_files = $(patsubst %.c,%.d,$(files2))//将files2中的所有.c转换为.dall:@echo B = $(B)@echo D = $(D)@echo E = $(E)@echo files = $(files)@echo files2 = $(files3)@echo dep_files = $(dep_files)

运行结果

 

 以上是最近学习Makefile的一些浅显的见解,写的不好,烦请各位大佬多多指正!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。