嵌入式学习之Linux入门篇笔记——17,makefile基本语法(上)

配套视频学习链接:http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p=4&share_source=copy_web&vd_source=a0ef2c4953d33a9260910aaea45eaec8
 

目录

一.设置 vim 首行缩进

二.Makefile 基本语法

三.Makefile 变量和变量赋值

四.自动化变量


一.设置 vim 首行缩进

vi /etc/vim/vimrc (rc 结尾的一般为配置文件)

输入 set tabstop=4,保存后退出即可。便发现 vim 打开后的缩进变成 4 个空格了

如果无法修改,需要以管理员权限进入 sudo vi /etc/vim/vimrc

二.Makefile 基本语法

语法格式:

        目标:依赖

        (tab)命令

举例:

目标:all

依赖:空

命令: gcc hello.c -o hello

上面的例子也可以写成:

目标:all 和 hello.o

依赖:hello.o 和 hello.c

命令: gcc hello.c -o hello 和 gcc -c hello.c -o hello.o

因为 all 依赖 hello.o 文件,所以要先执行 gcc -c hello.c -o hello.o 得到 hello.o 文件,然后才可以执行 gcc

hello.c -o hello。所以输入 make 命令后执行顺序如下。

在编译的时候,我们可以使用 make 目标来编译,如果我们不指定目标的话,默认执行的是第一个目标所对应的规则。也就是说 make 和 make all 是一样的。如上面的例子。

接下来,我们使用 make 目标的方法来编译。我们修改 makefile 代码如下:

然后我们输入命令 make clean 就可以直接执行 rm -rf *.o hello 命令。如下图所示:

但是,我们在当前目录下不能有和 makfile 目标名一样的文件。比如我在当前目录下创建一个名为

clean 的文件,然后在执行 make clean 命令就会报错。如下图所示:

为了解决这个问题,makfile 引入了一个新的概念,叫做伪目标,我们使用伪目标来声明 clean 就可以避免与当前目录下的同名文件发生冲突。

伪目标格式:

.PHONY:目标

所以,我们可以把上面的代码修改成如下图所示:

然后我们在执行 make clean 命令。尽管当前目录下有 clean 同名文件,make clean 命令也可以执行成功。如下图所示:

三.Makefile 变量和变量赋值

变量可以许多地方使用,比如目标,依赖,或者命令。

变量的赋值可以使用:=   ?=   :=   +=

变量的使用:通过 $() 来完成变量的引用。

示例 1:

使用 := 来赋值

使用 := 来给变量赋值,是立刻赋值在执行 var:=aaa 的同时变量值已经被确定了,所以最后打印为aaabbb,而不是 cccbbb

示例 2:

使用 = 来赋值

使用 = 来赋值,是延迟赋值使用他来赋值是 makfile 里面最后被指定的值。因为我们最后给变量 var1赋值为 ccc,所以最后打印为 cccbbb,而不是 aaabbb,如下图所示:

示例 3:

使用 ?= 来赋值

使用 ?= 来赋值的意思为,如果 var1 变量前面没有被赋值,那么就给他赋值为 ccc,如果前面已经赋值了,就使用前面的值,所以,打印为 aaabbb,而不是 cccbbb,如下图所示。

然后我们注释掉第一行代码,makefile 中的注释为#

在运行就会打印 cccbbb,因为前面没有给 var1 变量赋值。如下图所示

示例 4:使用 += 来赋值

使用 += 来赋值是追加赋值是在我们前面定义的好的字符串里面在添加进去新的字符串,所以运行会打印 aaa cccbbb。不过中间会有空格,如下图所示;

使用+=也类似与我们这样赋值,如下图所示:

如果赋值很长,我们也可以使用换行符 \,如下图所示

四.自动化变量

概念:不用定义,且会随着上下程序的不同而发生变化的变量

这里介绍三个最常用的自动化变量:

$@:表示所有目标

$<:表示第一个依赖文件,如果依赖模式是%,那么它就表示一系列文件。

(%为通配符,类似 linux 上的*)

$^:表示所有依赖。

在了解这个三个自动化变量之前,我们先来写一个程序:

main.c

hello.c

hello.h

Makefile

使用这个 makefile 虽然也可以成功编译,但是,一旦编译的文件多了,如果我们还这样来编写

makfile 就会变得非常的复杂。所以,自动化变量就排上用场啦。

接下来我们一步一步的来简化我这个 makefile。

简化一:用变量表示依赖文件

后面如果我们在增加依赖文件的话,我们直接在变量 var 后面增加就可以了。

简化二:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JS逆向三】逆向某某网站的sign参数,并模拟生成仅供学习

逆向日期&#xff1a;2024.02.06 使用工具&#xff1a;Node.js 类型&#xff1a;webpack 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某…

Ansible copy模块 复制文件使用 主服务器 给副服务器 复制文件使用 指定文件权限 覆盖备份等

目录 参数复制文件然后进行同时复制操作 给定内容生成文件&#xff0c;并制定权限验证 关于覆盖先查看当前内容覆盖并备份查看文件权限 还有有没有备份查看文件内容 参数 这个模块用于将文件复制到远程主机&#xff0c;同时支持给定内容生成文件和修改权限等。   其相关选项…

深入理解java之多线程(一)

前言&#xff1a; 本章节我们将开始学习多线程&#xff0c;多线程是一个很重要的知识点&#xff0c;他在我们实际开发中应用广泛并且基础&#xff0c;可以说掌握多线程编写程序是每一个程序员都应当必备的技能&#xff0c;很多小伙伴也会吐槽多线程比较难&#xff0c;但因为其实…

gem5学习(17):ARM功耗建模——ARM Power Modelling

目录 一、Dynamic Power States 二、Power Usage Types 三、MathExprPowerModels 四、Extending an existing simulation 五、Stat dump frequency 六、Common Problems 官网教程&#xff1a;gem5: ARM Power Modelling 通过使用gem5中已记录的各种统计数据&#xff0c;…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月10日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月10日 星期六 农历正月初一 春节 1、 国务院&#xff1a;到2025年&#xff0c;初步建成覆盖各领域、各环节的废弃物循环利用体系。 2、 国家移民管理局&#xff1a;部分国家人员可以用更多事由免签入境海南。 3、 市场…

使用AI开发一个红包封面生成器

使用 VUE3&#xff0c;和 Express 开发一个红包封面。 生成效果如下 体验地址&#xff1a;https://hongbao.digitalmodel.top/

政安晨:示例演绎TensorFlow的官方指南(三){快速使用数据可视化工具TensorBoard}

这篇文章里咱们演绎TensorFLow的数据可视化工具&#xff1a;TensorBoard。 在机器学习中&#xff0c;要改进模型的某些参数&#xff0c;您通常需要对其进行衡量。TensorBoard 是用于提供机器学习工作流期间所需测量和呈现的工具。它使您能够跟踪实验指标&#xff08;例如损失和…

Blender教程(基础)--试图的显示模式-22

一、透视模式&#xff08;AltZ&#xff09; 透视模式下可以实现选中透视的物体信息 发现选中了透视区的所有顶点 二、试图着色模式-显示网格边框 三、试图着色模式-显示实体 三、试图着色模式-材质预览 四、试图着色模式-显示渲染预览

RNA二级结构基础知识+一些绘制程序及用法

整理笔记翻出来的&#xff0c;以下所有程序的测试时间都是2019年11月&#xff0c;不保证现在是否能用。基本都来自论文。 此外&#xff0c;这些程序都属于能用&#xff0c;但是对长序列&#xff08;>3000&#xff09;或者复杂序列不够友好的。 &#xff08;后来我自己写了…

Qt PCL学习(三):点云滤波

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建、Qt PCL学习&#xff08;二&#xff09;&#xff1a;点云读取与保存 0. 效果演示 1. pcl_open_save.pro QT core guigr…

Project 2010下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件&#xff0c;不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理实现项目进度、成本的控制、分析和预测&#xff0c;使项目工期大大缩短&#xff0c;资源得到有效利用&#xff0c;提高经济效益。软件设计目的在于协助专案经理发…

除夕快乐(前端小烟花)

家人们&#xff0c;新的一年好运常在&#xff0c;愿大家在新的一年里得偿所愿&#xff0c;发财暴富&#xff0c;愿大家找到属于自己的那个公主&#xff0c;下面就给大家展示一下给公主的烟花 前端烟花 新的一年&#xff0c;新的挑战&#xff0c;愿我们不忘初心&#xff0c;砥砺…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

人力资源智能化管理项目(day04:组织架构)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 树组件应用 <!-- 展示树形结构 --><!-- default-expand-all默认展开所有节点 --><el-tree default-ex…

医学护理答案怎么查找? #笔记#学习方法#微信

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式&#xff0c;可以快速查找问题解析&#xff0c;加深对题目答案的理解。 1.滴墨书摘 这款软件相当于一个在线“摘抄本”&#xff0c;我们可以利用它来记录一些阅读时遇到的好句子或者是段落&#xff0c;或许下次…

Linux操作系统基础(五):Linux的目录结构

文章目录 Linux的目录结构 一、Linux目录与Windows目录区别 二、常见目录介绍&#xff08;记住重点&#xff09; Linux的目录结构 一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概…

【DDD】学习笔记-领域模型与函数范式

函数范式 REA 的 Ken Scambler 认为函数范式的主要特征为&#xff1a;模块化&#xff08;Modularity&#xff09;、抽象化&#xff08;Abstraction&#xff09;和可组合&#xff08;Composability&#xff09;&#xff0c;这三个特征可以帮助我们编写简单的程序。 通常&#…

JavaScript综合练习4

JavaScript 综合练习 4 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…