查看原文
其他

嵌入式杂谈之makefile补充

嵌入式Linux 2022-09-10

The following article is from 于宙 Author yz001

我看了下自己的文章库存,好像还没有一篇关于Makefile的文章,所以这篇刚好可以弥补自己的缺失。



makefile预定义变量

预定义变量即系统自带的变量

预定义变量作用
AR库文件维护程序的名称,默认为ar
AS汇编程序的名称,默认为as
CCc编译器的名称,默认为cc
CXXc++编译器的名称,默认为g++
ARFLAGS库文件维护程序选项,无默认值
ASFLAGS汇编程序选项,无默认值
CFLAGSc编译器选项,无默认值
CXXFLAGSc++编译器选项,无默认值

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文件不止一个文件解决方案

  1. 多个makefile文件,互相嵌套
  2. 使用伪目标 make all

makefile环境变量

  1. 普通变量导出以后即为环境变量

一般要求环境变量大写,普通变量小写

使用export 变量名进行导出

  1. 使用环境变量 环境变量类似于工程中所有makefile之间共享的全局变量

定义一个环境变量会影响到工程中的其他makefile文件,因此小心使用

普通变量只在当前文件起作用

  1. makefile本身自带的环境变量 例如上面提到的预定义变量

执行make命令的传参操作也相当于传入了一个环境变量(优先级最高,可以覆盖原来makefile文件中定义的变量值)

makefile通配符

符号作用
*若干个任意字符
一个任意字符
[]将中括号中字符依次进行匹配,不加空格

%表示任意字符,与*相似,但%一般只用于规则描述中,所以又称为规则通配符


===========


  

PS想加入技术群的同学,加了我好友后,就给我发「篮球的大肚子」这句话,有可能机器人打瞌睡,可以多发几次,不要发与技术无关的消息或者推广。

如果想获取学习资料,就在公众号后台回复「1024」,足够多的学习资料可以让你学习。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存