Makefile

举报
dz小伟 发表于 2022/11/02 19:37:27 2022/11/02
【摘要】 一、Makefile作用多个文件,方便编译链接过程。二、目标、依赖、命令目标就是最终要生成的东西依赖是用来生成目录的原材料命令就是加工方法make的过程其实就是使用命令将依赖加工成目标的过程三、通配符%,*,?,[]自动推导:就是Makefile的规则,当Makefile需要某一个目标时,他会把这个目标去套规则说明,一旦套上了某个规则说明,则Makefile会试图寻找这个规则中的依赖,如果能...

一、Makefile作用


多个文件,方便编译链接过程。

二、目标、依赖、命令


目标就是最终要生成的东西
依赖是用来生成目录的原材料
命令就是加工方法
make的过程其实就是使用命令将依赖加工成目标的过程


三、通配符%,*,?,[]


自动推导:就是Makefile的规则,当Makefile需要某一个目标时,他会把这个目标去套规则说明,一旦套上了某个规则说明,则Makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依赖生成目标。

%一般只用于规则描述中,又叫做规则通配符
*  若干个任意字符
? 1个任意字符
[] 将[]中的字符依次去和外面的结合匹配


四、定义和使用变量


定义和使用变量,和shell一样都没有变量类型,直接定义使用,引用变量时用$(var)

五、伪目标(.PHONY)


伪目标就是,单纯为了执行这个目标下面的命令,不会生成目标文件
伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令
伪目标可以直接写,不影响使用,也可以在前面用.PHONY来明确声明它是伪目标。
.PHONY clean

clean:

        rm *.o -f

六、引用其他Makefile(include指令)


有时候Makefile总体比较复杂,因此分成好几个Makefile来写。然后在主Makefile中引用其他的,用include指令来引用。引用的效果也是原地展开,和C语言中的头文件包含相似。

七、@用来静默执行


在makefile的命令行中前面的@表示静默执行。
默认情况下在执行一行命令前,会先把这行命令给打印出来,然后再执行这行命令。
静默执行:不打印命令,直接执行这行命令


八、Makefile中几种变量赋值运算符


=  直接赋值,被解析时他的值取决于最后一次赋值时的值
:= 也是直接赋值,就地直接解析,只用往前看即可
不加:把全局最后赋值后的变量解析
加:就地解析

va=abc
vb=$(va)gef
va=qq
all:
        @echo $(vb)
#把下面的qq解析赋值
xw@ubuntu:~/xiaowei/makefilexuexi$ make
qqgef
 
va=abc
vb:=$(va)gef
va=qq
all:
        @echo $(vb)
#abc解析赋值
xw@ubuntu:~/xiaowei/makefilexuexi$ make
abcgef

?= 赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略
+= 用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面
中间自动加空格


九、Makefile的环境变量


export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。
就是Makefile之间可以共享全局变量
Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile传的环境变量值优先级最高的,可以覆盖makefile中的赋值)


十 、Makefile的自动变量


$@   规则的目标文件名
$<     规则的依赖文件名
$^     依赖的文件集合

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。