Makefile基础总结

Makefile基础

注:来自于《朱老师物联网大讲堂》


Makefile是用来管理工程的

    在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,就会像这样:gcc a.c b.c c.c d.c e.c f.c g.c -o exe     每次编译都要输入一堆东西很麻烦,这个问题严重影响工作效率,怎么办?Makefile来解决

    目标:目标定格写,后面是冒号(冒号后面是依赖)

    依赖:依赖是用来产生目标的原材料。

    命令:命令前面一定是Tab,不能是顶格,也不能说多个空格。命令就是要生成那个目标需要做的动作。

 

Makefile的基本工作原理

    其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。

    其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。

    其三,我们直接执行make 和make 第一个目标  效果是一样的。(第一个目标其实就是默认目标)

 

进一步学习Makefile的资料

    我们学习Makefile的思路就是:先学会基本的概念和应用,先理解Makefile的概念和使用方法、工作原理。先自己会写简单的Makefile来管理工程。一般先学到这里就可以了,更深入的内容可以随同稍后的课程一起来学习,我们讲到课程的时候会再次提及并且逐步深入。

    可以深入学习Makefile,看《跟我一起学Makefile》(作者:陈皓)

   

Makefile的作用和意义

(1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。

(2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。所以要分析uboot必须对Makefile有所了解。

 

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

(1)%是Makefile中的通配符,代表一个或几个字母。也就是说%.o就代表所有以.o为结尾的文件。

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

 

Makefile中定义和使用变量

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

 

伪目标(.PHONY)

(1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。

(2)伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。

(3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标。

 

Makefile的文件名

合法的一般有2个:Makefile或者makefile

 

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

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

 

Makefile中的注释用#

Makefile中注释使用#

 

Makefile命令前面的@用来静默执行

(1)在makefile的命令行中前面的@表示静默执行。

(2)Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令。

(3)如果你不想看到命令本身,只想看到命令执行就静默执行即可。

 

Makefile中几种变量赋值运算符

(1)=       最简单的赋值

(2):=      一般也是赋值

注:以上这两个大部分情况下效果是一样的,但是有时候不一样。用=赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以你看变量引用的值时不能只往前面看,还要往后面看。用:=来赋值的,则是就地直接解析,只用往前看即可。

(3)?=  如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。(实验可以看出:所谓的没有赋值过其实就是这个变量没有被定义过)

(4)+=      用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于strcat。(在shell makefile等文件中,可以认为所有变量都是字符串,+=就相当于给字符串stcat接续内容)(注意一个细节,+=续接的内容和原来的内容之间会自动加一个空格隔开)

注意:Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。

 

Makefile的环境变量

(1)makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。

(2)环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有Makefile之间可以共享的全局变量,而普通变量只是当前本Makefile中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中别的Makefile文件,因此要小心。

(3)Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量(譬如我们在make执行时给makefile传参。makeCC=arm-linux-gcc,其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile传的环境变量值优先级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预定义的宏__LINE__ __FUNCTION__等一样。

 

Makefile中使用通配符

(1)*       若干个任意字符

(2)?       1个任意字符

(3)[]      将[]中的字符依次去和外面的结合匹配

注:还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。

关于通配符,Makefile还有一些wildcard等比较复杂的通配符用法,具体参考《跟我一起学Makefile》即可。

 

Makefile的自动变量

(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。

(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。

(3)常见自动变量:

$@     规则的目标文件名

$<     规则的依赖文件名

$^     依赖的文件集合

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值