嵌入式杂谈之makefile补充
The following article is from 于宙 Author yz001
我看了下自己的文章库存,好像还没有一篇关于Makefile的文章,所以这篇刚好可以弥补自己的缺失。
makefile预定义变量
预定义变量即系统自带的变量
预定义变量 | 作用 |
---|---|
AR | 库文件维护程序的名称,默认为ar |
AS | 汇编程序的名称,默认为as |
CC | c编译器的名称,默认为cc |
CXX | c++编译器的名称,默认为g++ |
ARFLAGS | 库文件维护程序选项,无默认值 |
ASFLAGS | 汇编程序选项,无默认值 |
CFLAGS | c编译器选项,无默认值 |
CXXFLAGS | c++编译器选项,无默认值 |
makefile自动变量
自动变量 | 作用 |
---|---|
$* | 不包含扩展名的目标文件名称 |
$< | 第一个依赖文件名称 |
$? | 所有时间戳比目标文件晚的依赖文件 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件 |
最下面两个常用
makefile隐式规则
自动寻找.o
文件对应的同名.c
文件
不用指定生成.o
文件的规则
相当于指定.o
文件以后,会自动将同名.c
文件进行编译
这在uboot
以及linux kernel
中是非常常见的
在uboot
以及linux kernel
中经常出现include ···config.mk
这也相当于包含一个子makefile,虽然文件名不像,但可以把它当作一个makefile文件来看待,二者基本没有区别
引用其他makefile及makefile嵌套
包含:
include makefile文件名
相当于子makefile文件直接展开
嵌套:
subsystem:
cd subdir && $(MAKE)
等价于:
subsystem:
$(MAKE) -C subdir
上面两种写法效果相同
makefile管理命令
命令 | 作用 |
---|---|
-C dir | 读入指定目录下面的makefile |
-f file | 读入当前目录下的file文件为nakefile |
-i | 忽略所有命令执行错误 |
-I dir | 指定被包含的makefile所在目录 |
源文件过多的编译方案
makefile分开多文件或者分级
output文件不止一个文件解决方案
多个makefile文件,互相嵌套 使用伪目标 make all
makefile环境变量
普通变量导出以后即为环境变量
一般要求环境变量大写
,普通变量小写
使用export 变量名
进行导出
使用环境变量 环境变量类似于工程中所有makefile之间共享的全局变量
定义一个环境变量会影响到工程中的其他makefile文件,因此小心使用
普通变量只在当前文件起作用
makefile本身自带的环境变量 例如上面提到的预定义变量
执行make
命令的传参操作也相当于传入了一个环境变量(优先级最高,可以覆盖原来makefile文件中定义的变量值)
makefile通配符
符号 | 作用 |
---|---|
* | 若干个任意字符 |
? | 一个任意字符 |
[] | 将中括号中字符依次进行匹配,不加空格 |
%
表示任意字符,与*相似,但%
一般只用于规则描述中,所以又称为规则通配符
===========
PS:想加入技术群的同学,加了我好友后,就给我发「篮球的大肚子」这句话,有可能机器人打瞌睡,可以多发几次,不要发与技术无关的消息或者推广。
如果想获取学习资料,就在公众号后台回复「1024」,足够多的学习资料可以让你学习。