博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux---makefile https://blog.csdn.net/SunXiWang/article/details/78701130
阅读量:3919 次
发布时间:2019-05-23

本文共 2453 字,大约阅读时间需要 8 分钟。

一、Makefile的作用和意义

(1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。
(2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。所以要分析uboot必须对Makefile有所了解。

2、目标、依赖、命令(加工方法)

3、通配符%和Makefile自动推导(规则)

%	若干个任意字符。%一般只用于规则描述中,又叫做规则通配符。	//也就是说%.o就代表所有以.o为结尾的文件。*  	若干个任意字符?	一个任意字符[]  将[]中的字符依次去和外面的结合匹配关于通配符,Makefile还有一些wildcard等比较复杂的通配符用法,具体参考《跟我一起学Makefile》即可。

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

led.bin: start.o        #3、将led.o加工生成led.bin

arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210

./mkx210 led.bin 210.bin

%.o : %.S

arm-linux-gcc -o $@ $< -c #1、这条命令会把led.S加工,生成led.o

%.o : %.c

arm-linux-gcc -o $@ $< -c #2、这条命令把led.c加工,生成led.o

clean:

rm *.o *.elf *.bin *.dis mkx210 -f

4、Makefile中定义和使用变量

(1)Makefile中定义和使用变量,和shell脚本中非常相似。相似是说:都没有变量类型,直接定义使用,引用变量时用$var

5、伪目标(.PHONY)

(1)伪目标:单纯执行命令,不是为了得到什么(目标本身不代表一个文件)(2)伪目标一般都没有依赖(不加依赖意思就是无条件执行)	因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,(3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标。

6、Makefile的文件名

(1)Makefile的文件名合法的一般有2个:Makefile或者makefile

7、Makfile中引用其他Makefile(include指令)

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

8、Makefile中的注释用#,和shell一样9、命令前面的@用来静默执行	//Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令。	//如果你不想看到命令本身,只想看到命令执行就静默执行即可。10、Makefile中几种变量赋值运算符(1)=  最简单的赋值		在被解析时他的值取决于最后一次赋值时的值,变量引用的值时不能只往前面看,还要往后面看。(2):=  一般也是赋值		就地直接解析,只用往前看即可(3)?= 若变量没有被赋值则执行语句,反之忽略;		//所谓的没有赋值过其实就是这个变量没有被定义过		//定义过了的变量的值缺省为空(4)+=   用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于strcat。	(在shell makefile等文件中,可以认为所有变量都是字符串,+=就相当于给字符串stcat接续内容)	(注意一个细节,+=续接的内容和原来的内容之间会自动加一个空格隔开)
注意:Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。11、Makefile的环境变量(1)makefile中用export导出的后就变成环境变量👉👉可以被其他位置的makefile所使用	//环境变量:整个工程中所有Makefile之间可以共享的全局变量	//普通变量:当前本Makefile中使用的局部变量	一般情况下要求环境变量名用大写,普通变量名用小写。	//导出称为环境变量后要注意别互相影响其他makefile的使用Makefile中可能有一些环境变量来源:	1、可能是makefile本身自己定义并导出的环境变量	2、当前的执行环境提供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。	我们在make时给makefile传的环境变量值优先级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预定义的宏__LINE__ __FUNCTION__等一样。

13、Makefile的自动变量

(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
(3)常见自动变量:

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

转载地址:http://pbhrn.baihongyu.com/

你可能感兴趣的文章
为什么曾经优秀的人突然变得平庸?
查看>>
.NET 5 中的隐藏特性
查看>>
.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你
查看>>
我画着图,FluentAPI 她自己就生成了
查看>>
BenchmarkDotNet v0.12x新增功能
查看>>
使用 .NET 5 体验大数据和机器学习
查看>>
C# 中的数字分隔符 _
查看>>
使用 docker 构建分布式调用链跟踪框架skywalking
查看>>
Github Actions 中 Service Container 的使用
查看>>
别在.NET死忠粉面前黑.NET5,它未来可期!
查看>>
Winform 进度条弹窗和任务控制
查看>>
部署Dotnet Core应用到Kubernetes(二)
查看>>
持续交付二:为什么需要多个环境
查看>>
FreeSql接入CAP的实践
查看>>
浅析 EF Core 5 中的 DbContextFactory
查看>>
听说容器正在吃掉整个软件世界?
查看>>
真实经历:整整一年了,他是这样从程序员转型做产品经理的
查看>>
netcore一键部署到linux服务器以服务方式后台运行
查看>>
还在犹豫是否迁移.NET5?这几个项目已经上线了!
查看>>
被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?
查看>>