makefile语法简介

最近在研究uboot和linux kernel,makefile看的晕头转向,写点东西来记录一下。
make的语法相当多而且复杂,这里只列出一些基本的语法规则,至少能让我们看懂makefile,遇到个别看不懂语法再去Google就是咯。
基本的makefile结构是这样的:
目标(target):目标文件1  目标文件2
    gcc -o 欲新建的可执行文件 目标文件1 目标文件2
target就是我们想要建立的东西,而目标文件则是具有相关性的object files,目标与相关文件之间以":"隔开。建立可执行文件命令的那一行(即gcc操作那一行)开头一定要加上一个<Tab>符!即命令行必须以<Tab>键为开头。
当我们想要两个以上的执行操作时,比如清除所有目标文件与可执行文件,makefile就应该这么写:
main:main.o sin_value.o cos_value.o
    gcc -o main main.o sin_value.o cos_value.o -lm
clean:
    rm -rf main main.o sin_value.o cos_value.o
这样,我们在makefile里就有了两个目标main 和 clean ,也就是说make时就有了两个命令。
但是这样写我还觉得烦,每次都要写一大堆相关文件,有时还要记得写链接参数,能不能再简化呢?重复三次以上的事情就必须要让它自动化!
LIBS=-lm
OBJS=main.o sin_value.o cos_value.o
main:${OBJS}
    gcc -o main ${OBJS} $(LIBS)
clean:
    rm -rf main ${OBJS}
与shell script语法有点不一样的是,变量与变量内容之间的"="两旁可以有空格,变量内容之间不可以有":"。运用变量时应该以${}或$()方式读取。
另外,需要说明的是,这个makefile运行的shell中的环境变量是可以内套用的。举个例子,比如说CFLAGS这个环境变量,我们既可以再命令行中定义,也可在makefile中定义。什么意思呢?演示一下就明白了
[root@www ~]# CFLAGS="-Wall" make main

或者

LIBS=-lm
OBJS=main.o sin_value.o cos_value.o
CFLAGS = -Wall
main:${OBJS}
    gcc -o main ${OBJS} $(LIBS)
clean:
    rm -rf main ${OBJS}
并且命令行中定义的环境变量第一优先,makefile中定义的环境变量第二优先,那么shell原有的环境变量就是最后的啦。

还有一点,makefile中 "$@" 可以代表当前的目标,即
main:${OBJS}
    gcc -o $@ ${OBJS} ${LIBS}

这里的 $@ 就代表main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值