iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第二十章 makefile 基本语法(上)
本章内容对应视频讲解链接(在线观看):https://www.bilibili.com/video/BV1M7411m7wT?p=22
20.1 设置vim首行缩进
vi /etc/vim/vimrc (rc结尾的一般为配置文件)
在最后一行输入 set tabstop=4,保存后退出即可。便发现vim打开后的缩进变成四个空格了。
20.2 Makefile 基本语法
语法格式:
目标:依赖
(tab)命令
举例:
目标: all
依赖:空
命令: gcc hello.c -o hello
上面的例子也可写成:
目标:all 和 hello.c
依赖:hello.o和 hello.c
命令: gcc hello.c -o hello 和 gcc -c hello.c
因为all 依赖hello.o文件,所以要先执行gcc -c hello.c 得到 hello.o 文件,然后才可以执行 gcc hello.c -o hello 。所以输入make 命令后执行顺序如下图所示。
在编译的时候,我们可以使用make 目标来编译,如果我们不指定目标的话,默认执行的是第一个目标所对应的规则。也就是说make 和 make all 是一样的。如上面的例子。
接下来,我们使用 make 目标的方法来编译。我们使用 make 目标的方法来编译。我们修改makefile 代码如下图所示:
然后我们输入命令 make clean 就可以直接执行 rm -rf *.o hello 命令。如下图所示。
但是,我们在当前目录下不能和makefile 目标名一样的文件。比如我在当前目录下创建一个名为clean的文件,然后执行 make clean 命令就会报错。如下图所示。
为了解决这个问题,makefile 引入了一个新的概念,叫做伪目标,我们使用伪目标来声明clean 就可以避免与当前目录下的同名文件发生冲突。
伪目标格式;
.PHONY:目标
所以,我们可以把上面的代码修改成如下图所示:
然后我们在执行 make clean 命令。尽管当前目录下有clean 同名文件, make clean 命令也可以执行成功。如下图所示。
20.3 Makefile 变量和变量赋值
变量可以对许多地方使用,比如目标,依赖。或者命令。
变量的赋值可以使用: = ?= := +=
变量的使用:通过$() 来完成变量的引用。
示例1:
使用 := 来赋值
使用 := 来给变量赋值,是立刻赋值,在执行 var:=aaa的同时变量值已经被确定了,所以最后打印为 aaabbb,而不是 cccbbb,如下图所示。
示例2:
使用=来赋值
使用 =来赋值,是延迟赋值,使用他来赋值是makefile 里面最后被指定的值。因为我们最后给变量var1赋值为 ccc ,所以最后打印为 cccbbb ,而不是 aaabbb ,如下图所示:
示例3:
使用 ?=来赋值
使用?= 来赋值,如果 var1 变量前面没有被赋值,那么就给它赋值为 ccc ,如果前面已经赋值了,就适应前面的值,所以,打印为 aaabbb ,而不是 cccbbb ,如下图所示。
然后我们注释掉第一行代码,makefile 中的注释为 #
在运行就会打印 cccbbb ,因为前面没有给 var1变量赋值。如下图所示
示例4 :使用+=来赋值
使用+=赋值是追加赋值,是在我们前面定义的好的字符串里面在添加进去新的字符串,所以运行会打印aaa bbbccc 。不过中间会有空格,如下图所示:
使用+=也类似于我们这样赋值,如下图所示:
如果赋值很长,我们也可以使用换行符/,如下图所示
20.4 自动化变量
自动化变量就是不用定义且会随着上下程序的不同而发生变化的变量叫做自动化变量。
这里介绍三个最常用的自动化变量:
$@: 表示所有目标
$< :表示第一个依赖文件,如果依赖模式是%,那么他就表示一系列文件。
(%为通配符,类似 linux 上的 *)
$^ :表示所有依赖。
在了解这三个自动化变量之前,我们先来写一个程序:
main.c
hello.c
hello.h
Makefile
使用这个makefile 虽然也可以成功编译,但是,一旦编译的文件多了,如果我们还这样来编写makefile 就会变得非常复杂。所以,自动化变量就派上用场啦。
接下来我们一步一步的来简化我这个 makefile 。
简化一:用变量表示依赖文件
后面如果我们在增加依赖文件的话,我们直接在变量 var 后面增加就可以了。
简化二:
使用通配符 % ,和自动化变量 $< 、$@ 代替依赖和目标,简化完如下图所示:
使用自动化变量 $^ 表示所有文件依赖的列表,简化完如下图所示: