***Makefile
用来做项目管理,方便编译链接过程。自动推导是Makefile的法则。
目标:最终要生成的东西。顶格写,后面是依赖。
依赖:用来生成目标的原材料。
命令:加工方式。
一个Makefile可以有多个目标,可以通过make+目标名实现目标,在默认的情况下实现的是第一个目标。
%是Makefile的通配符,例如%.x就代表.x的所有文件。
Makefile定义变量和使用变量和shell很像,是一个弱类型语言,没有变量的类型,直接定义使用,引用时用$var。
伪目标直接执行目标之后的命令,没有依赖。一般用.PHONY声明。
***Makefile引用其他的Makefile:
用include引用,应用的效果是原地展开,类似于C语言。
静默执行:在执行命令前加上@可以使得命令输出时仅仅只是输出命令结果而不是将命令行本身也输出。
= 赋值时以最后一个值为变量最终的值。
?= 如果前面没有赋值就执行赋值语句,反则不执行。
+= 给一个已经赋值的变量接续赋值,把这次的值加到原来的值后面(将变量当做字符串来处理)
:=赋值时就地直接解析,只用往前看。也就是一般的赋值。
Makefile的环境变量:
在Makefile中用export导出的就是环境变量,大写表示
和普通变量不同,他是整个工程中所有Makefile可以共享的全局变量。
实际make时给Makefile传进去的参数优先级高于Makefile内定义的变量,可以覆盖Makefile的赋值
Makefile的通配符:
1. * 表示若干个任意的随意字符。
2. ?表示一个与依赖内相同的字符。
3. []表示括号内与依赖内相同的字符。
4. %表示任意多个字符,但是一般只用于规则描述之中,叫做规则通配符。
Makefile的自动变量:预定义的特殊意义符号,类似于C语言编译器中预定义的宏。
1. $@ 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
2. $< 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
3. $^ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
4.$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标
***mkfile的深解:
裸机之中的mkfile将程序的编译和链接分开执行;
在内部实际上编译个链接是分不开的,编译使用编译器gcc,链接使用链接器ld;
链接器得到的ld.elf其实就是我们可以执行的文件,但是在嵌入式裸机之中我们需要的是可以进行烧写的文件,也就是镜像,因此我们需要用这个led.elf作为原材料来制作镜像,制作工具就是交叉工具链之中的arm-linux-objcopy,再使用arm-linux-objdump进行反汇编,将led.elf得到实际的汇编代码。