【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十章 makefile 基本语法(上)

news2024/10/9 11:39:40

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 后面增加就可以了。

简化二:

使用通配符 % ,和自动化变量  $< 、$@ 代替依赖和目标,简化完如下图所示:

 

使用自动化变量 $^ 表示所有文件依赖的列表,简化完如下图所示: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

头疼来袭?别急,这份自救指南让你秒变“不痛达人”!

在这个快节奏的时代&#xff0c;头疼仿佛成了我们生活中的“不速之客”&#xff0c;时不时就来敲敲门&#xff0c;让人措手不及。无论是工作压力山大、熬夜追剧后的疲惫&#xff0c;还是突如其来的偏头痛&#xff0c;都让人苦不堪言。但别怕&#xff0c;今天就来给大家送上一份…

基于SpringBoot 助农农产品销售平台小程序 【附源码】

基于SpringBoot 助农农产品销售平台小程序 效果如下&#xff1a; 管理员主界面 用户管理界面 农户管理界面 农户主界面 小程序首页界面 农产品详情界面 详情界面 研究背景 随着互联网技术的快速发展和智能手机的普及&#xff0c;传统的农产品销售模式面临着诸多挑战。信息不…

《RabbitMQ篇》交换机基本概览

生产者都是把消息给交换机&#xff0c;由交换机分发给消息队列。 routingKey&#xff1a;路由键&#xff0c;也可称为绑定&#xff0c;是交换机和队列之间的桥梁&#xff0c;交换机会根据routingKey来把消息转发到对应的队列。 Fanout 不处理路由键。你只需要简单的将队列绑定…

【业务场景】最全的购物车设计与实现

前言 博主最近在做一个购物商城&#xff0c;正好设计到购物车模块&#xff0c;于是乎全面的来聊一聊购物车模块实现的一些核心要点吧&#xff0c;很值得反复品味的设计&#xff0c;当需要实现购物车的时候&#xff0c;本文应该拿来就能用。 目录 1.需要解决的核心问题清单 2…

下一代电源管理:Modern Standby与S3睡眠的对比

Modern Standby与S3睡眠的对比 一、引言二、Modern Standby概述三、S3睡眠模式概述四、Modern Standby与S3睡眠的差异五、实际应用和适用场景六、测试Modern Standby的性能6.1、PowerCfg命令行工具6.2、Windows Performance Toolkit 七、总结 一、引言 电源管理在现代计算设备…

Midjourney中文版:解锁你的创意之旅

在创意与技术的交汇点&#xff0c;Midjourney中文版正等待着每一位热爱艺术、渴望表达的灵魂。这不仅仅是一款AI绘画工具&#xff0c;更是一个激发无限灵感、让创意自由翱翔的奇妙平台。 Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://w…

Linux操作系统——软件包的管理(实验报告)

实验——软件安装的基本操作 一、实验目的 熟悉软件安装流程&#xff0c;掌握java的安装流程&#xff0c;熟悉相关命令的操作。 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常&#xff1b; 配置&#xff1a;win10系统&#xff0c;内存大于8G 硬盘500G及以上…

机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究。本文针对黄金价格预测问题&#xff0c;展开基于改造后的长短期记忆网络BiLSTM的黄金价格模型研究。文章首先介绍了项目背景&#xff0c;随后详细…

LSTM的变体

一、GRU 1、什么是GRU 门控循环单元&#xff08;GRU&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;它通过引入门控机制来控制信息的流动&#xff0c;从而有效地解决了传统RNN中的梯度消失问题。GRU由Cho等人在2014年提出&#xff0c;它简化了…

判断回文 python

题目&#xff1a; 输入一个四位数&#xff0c;判断该数是否为回文数&#xff0c;回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数&#xff0c;比如1221。 代码法1&#xff1a; ninput() nint(n) if n<1000 or n&g…

微积分复习笔记 Calculus Volume 1 - 2.2 The Limit of a Function

2.2 The Limit of a Function - Calculus Volume 1 | OpenStax

中控自动化测试实战和实车智能驾驶业务解析

一.中控自动化测试流程及环境搭建 1.中控自动化测试流程 2.中控自动化测试环境的搭建 1.JDK环境配置 安装 Java安装包.生成java\bin jre\bin JAVA_HOME: java目录 c:\java path:%JAVA_HOME%\bin jre\bin 为了后面appium server GUI客户端中的环境配置 2.SDK 配置 pal…

怎么编辑图片?这5款工具教你快速编辑

怎么编辑图片&#xff1f;编辑图片是一项既具创意又实用的技能&#xff0c;它不仅能够提升图片的视觉效果&#xff0c;增强信息的传达力&#xff0c;还能激发无限的创作灵感。通过编辑图片&#xff0c;我们可以轻松调整色彩、添加文字、裁剪构图&#xff0c;甚至创造出令人惊叹…

Oxygen Forensic Detective 17.0 发布,新增功能概览

Oxygen Forensic Detective 17.0 发布&#xff0c;新增功能概览 Oxygen Forensic Detective Windows 17 Multilingual - 领先的一体化数字取证软件 digital forensic software 请访问原文链接&#xff1a;https://sysin.org/blog/oxygen-forensic-detective/&#xff0c;查看…

【学习笔记】SquareLine Studio安装教程(LVGL官方工具)

一.简介与导航&#xff1a; SquareLine Studio是由LVGL官方开发的一款UI设计工具&#xff0c;采用图形化进行界面UI设计&#xff0c;轻易上手。 SquareLine Studio官方网址&#xff1a;https://squareline.io/SquareLine Studio官方文档&#xff1a;https://docs.squareline.io…

车牌检测系统源码分享

车牌检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

3、Docker搭建MQTT及Spring Boot 3.x集成MQTT

一、前言 本篇主要是围绕着两个点&#xff0c;1、Docker 搭建单机版本 MQTT&#xff08;EMQX&#xff09;&#xff0c;2、Spring Boot 3.x 集成 MQTT&#xff08;EMQX&#xff09;&#xff1b; 而且这里的 MQTT&#xff08;EMQX&#xff09;的搭建也只是一个简单的过程&#x…

为什么现在的大学生很难真正学好LabVIEW编程?

学习LabVIEW编程对大学生来说可能存在以下挑战&#xff1a; 学习曲线陡峭&#xff1a;尽管LabVIEW提供直观的图形化编程环境&#xff0c;便于初学者入门&#xff0c;但要深入掌握其高级功能和复杂应用&#xff0c;仍需要投入大量时间和精力。随着学习的深入&#xff0c;概念和应…

CAN与CANFD的区别

CAN概念&#xff1a; CAN&#xff0c;全称为Controller Area Network&#xff0c;即控制器局域网络&#xff0c;是一种用于汽车电子系统中的串行通信协议。它由德国电气工程师协会&#xff08;Bosch&#xff09;在1983年开发&#xff0c;并在1986年正式推出。CAN协议主要用于汽…

牛客:Holding Two,Inverse Pair,Counting Triangles

Holding Two 题目描述 登录—专业IT笔试面试备考平台_牛客网 ​​运行代码 #include<bits/stdc.h> using namespace std; const int N3e45; string s1,s2; int main(){int n,m;cin>>n>>m;for(int i0;i<m;i){if(i&1){s10;s21;} else{s11;s20;} }fo…