【嵌入式】Makefile新手入门

使用gcc编译:

几乎最简单的gcc编译命令,将a.c和b.c编译成一个执行文件test。

gcc -o test a.c b.c 
需要Makefile原因:

只要我们在shell执行上面的命令,gcc都会将a.c和b.c编译。无论两个C文件的内容是否修改过。我们很容易想到,万一某个工程有许多文件编译成一个可执行文件,每当我们只要是修改某个文件的一个标点符号都需要编译一次,而且还需要等待较长时间。那样何年何月才会把这个项目完成。
要是有一个工具,能帮我判别我这个文件是否被需改过,没修改就不用帮我编译,修改的帮我编译一下,这样该有多好啊!
这下我们就需要Makefile去帮助我们做这个。

Makefile的核心:

目标 : 依赖1 依赖2 …
[TAB]命令

当依赖文件比目标文件“新”(也有可能不存在)的时候,才会执行命令。
其实或多或少没那么智能,甚至有点鸡肋。这个“新”的意思就是判断依赖的保存时间是否更改来判断的。其实也已经足够了。谁会无聊“调皮”地戏弄一个可以用的“轮子”(无需更改)。

Makefile的简单语法:
  • .通配符: %.o
    $@ 表示目标
    $< 表示第1个依赖文件
    $^ 表示所有依赖文件

  • 假想目标: .PHONY:
    如果目录下存在clean文件,make clean执行的结果就不是清除;
    加上.PHONY: clean,就会执行我们makefile里的目标clean

  • 即时变量、延时变量, export
    简单变量(即时变量) :
    A := xxx # A的值即刻确定,在定义时即确定
    B = xxx # B的值使用到时才确定
    使用变量: $(A) $(B)
    := # 即时变量
    = # 延时变量
    ?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
    += # 附加, 它是啥变量还是取决于前面的定义

  • make时取消命令输出
    在命令前面加上@
    -函数
    $(foreach var,list,text)
    $(filter pattern…,text) # 在text中取出符合patten格式的值
    $(filter-out pattern…,text) # 在text中取出不符合patten格式的值
    $(wildcard pattern) # pattern定义了文件名的格式,
    # wildcard取出其中存在的文件
    ( p a t s u b s t p a t t e r n , r e p l a c e m e n t , (patsubst pattern,replacement, (patsubstpattern,replacement,(var)) # 从列表中取出每一个值
    # 如果符合pattern
    # 则替换为replacement

未完。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值