我看了下自己的文章库存,好像还没有一篇关于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文件不止一个文件解决方案

  1. 多个makefile文件,互相嵌套

  2. 使用伪目标 make all

makefile环境变量

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

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

使用export 变量名进行导出

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

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

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

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

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

makefile通配符

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

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

===========

  

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

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

嵌入式杂谈之makefile补充相关推荐

  1. linux驱动日志格式,( 转)嵌入式Linux驱动Makefile

    天气: 晴朗 心情: 高兴 ( 转)嵌入式Linux驱动开发笔记 1.1        模块的编译 Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式.简单的例子, Be ...

  2. windows kernel 可以直接读写文件系统资料吗_嵌入式杂谈之文件系统

    作者:于宙 , 经授权转载:编辑略作调整: 文件系统可以说是嵌入式中绕不开的一大块内容.之前我对文件系统认知一直停留在在U盘格式的理解上,直到接触了嵌入式Linux才发现这里面大有文章,以Linux启 ...

  3. arm 交叉编译找不到so_嵌入式杂谈之交叉编译

    这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一 ...

  4. 嵌入式杂谈之文件系统

            文件系统可以说是嵌入式中的一大块,也是绕不过的一部分.之前我对文件系统认知一直停留在在U盘格式的理解上,直到接触了嵌入式Linux才发现这里面大有文章,以Linux启动挂载根文件系统为 ...

  5. 嵌入式杂谈之中断向量表

    虽说接触了好久的单片机或者说嵌入式开发,不过对于有些概念还是比较模糊,因此此系列将会从一些零碎的小知识点出发,慢慢的遍历整张嵌入式开发的地图. 这次先来看一下中断向量表. 至于为什么会提到中断向量表, ...

  6. 适合嵌入式的C++开源项目-Workflow

    在来腾讯之前,我是没有真正用C++开发过一个完整的项目的,然后,赶鸭子上架,鹅厂的人特别喜欢用C++,而且用的特别好.我这次推荐一个开源的C++项目,希望喜欢C++,或者想往C++方向发展的同学可以看 ...

  7. shell和Makefile

    shell介绍 shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式 (2)我们可以使用shell和操作系统,uboot等软件系 ...

  8. linux下c 编译脚本,Linux下编译C语言与makefile脚本语言

    GCC 1.Source CRT 软件:可以控制linux的终端. 2.FileZilla 软件: windows 远程传文件到linux. 使用sourceinsight 文本编辑器 一linux编 ...

  9. 嵌入式三级知识点、错题总结

    一-05:数字(电子)文本 Unicode编码:用于计算机统一处理.存储和传输.其编码方案常用的有两种:UTF-8和UTF-16 这种编码方式与国标的GB18030.GB2312并不完全相同,大多数汉 ...

最新文章

  1. kvm虚拟化技术下虚拟机磁盘的数据保护
  2. spingboot和mybatis,纯注解方式
  3. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
  4. Ubuntu装机后的基础应用
  5. MySQL查询执行的基础——查询优化处理
  6. word格式:导出与导入(如何将一套格式样式应用于另一个文档)- 教程篇
  7. C#的多线程机制探索3
  8. Laravel服务提供者在平台短信服务中的应用
  9. golang(7 方法重写)
  10. java方法里面能改定时器的时间吗_Kafka 时间轮的原理和实现
  11. Android入门基础教程1
  12. 【简单易上手】姓氏头像制作生成头像组合微信小程序源码下载
  13. 7000字爆肝!我把14个自学编程的压箱底网站全部分享给你们啦
  14. 旭元数艺:只争朝夕 不负韶华
  15. Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)
  16. Java学习---day14_集合框架03
  17. Mysql出现问题:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)解决方案
  18. 使用element回到顶部组件报错“Error: target is not existed: .page-component__scroll .el-scrollbar__wrap“
  19. Angular4简介
  20. 网络安全菜鸟学习之漏洞篇——逻辑漏洞(二)

热门文章

  1. 判断该网页是在什么设备打开。
  2. Win10 IIS本地部署网站运行时图片和样式不正常?
  3. C#中跨窗体操作(1)--事件
  4. 街舞中的rolling机器人_REMEMBER街舞培训中心2020年元旦汇演
  5. python3.5.2使用教程_Python3.5.2-初级教程.docx
  6. python自带的解释器叫做_python学习
  7. mysql读写分离_MySQL基于amoeba读写分离实验
  8. vue router传参_新手使用vue-router传参时注意事项
  9. springboot怎么杀进程_线上服务平均响应时间太长,怎么排查?
  10. 线性判别结合源码分析LDA原理