摘要:该文章主要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的。

LiteOS源码中使用makefile进行文件的批处理编译和连接到生成文件,如果在使用LiteOS来设计工程时使用GNU编译器进行编译,一般会都会使用到makefile进行编译和链接程序,如果使用的Keil或IAR的编译器进行编译则在Keil IDE或IAR IDE中设置编译器信息和文件包换路径就可以了进行编译链接和输出文件。

1、makefile介绍

简单的说makefile就是make执行的文件,将代码变成可行性文件的的过程叫做编译,组成一系列文件的编译叫做构建(build),Make是GNU提供的构建工具,主要用C、C++项目的构建编译过程,要学会使用Make,我们就需要学会使用makefile编写,makefile,该文件描述了如何编译和链接由几个C源文件和几个头文件组成的文本编辑器。当明确要求时,makefile还可以告诉make如何运行其他命令(例如,删除某些文件作为清理操作)

1.1 makefile 规则

一个简单的makefile由具有以下形状的“规则”组成:

target … : prerequisites …
recipe

target(目标)通常是由程序生成的文件的名称。目标的示例是可执行文件或目标文件。目标也可以是要执行的操作的名称,例如“clean”;

prerequisites(前置条件)是一个文件,该文件用作创建目标的输入。一个目标通常取决于几个文件;

recipe(命令)是一种要执行的动作。配方可能在同一行上或在自己的行上具有多个命令。请注意:您需要在每个配方行的开头添加一个制表符!这是一个模糊的地方,引起了人们的注意。如果您希望在食谱中使用制表符以外的其他字符作为前缀,则可以将.RECIPEPREFIX变量设置为其他字符

"目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。

一条规则说明了如何以及何时重新制作作为特定规则目标的某些文件。 make根据创建或更新目标的先决条件执行方法。规则还可以解释如何以及何时执行某项操作。一个makefile可能包含除规则之外的其他文本,但是一个简单的makefile只需包含规则。规则看起来可能比此样例中显示的要复杂一些,但所有规则或多或少都适合该模式。

1.2Makefile 语法

① # 表示注释

② 通配符用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。

③ %模式匹配

如需要编译当前目录下a.c和b.c两个文件,原来的写法是:

a.o: a.c
b.c: b.c

利用%可以简写为:

%.o : %.c

在处理大量同类型文件时既可以利用%简写文件

④ “=” 自定义变量

txt = Hello World
test:
@echo $(txt)

上面的 txt代替的了“Hello World”

同时基于“=” Makefile提供了(=、:=、?=、+=)四个赋值运算操作。

⑤ 内置变量

Make有自己的操作变量,特指一些自己的功能命令;如:$(CC) 指向当前使用的编译器,$(MAKE) 指向当前使用的Make工具

具体变量规则可参考:https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

⑥ 自动变量(Automatic Variables)

makefile提供一些与规则相关的变量,常用的有:

(1)$@ -----指代当前目标

(2)$< -----指代第一个前置条件

a.txt: b.txt c.txt
cp $< $@

上面的代码和下面的代码一致

a.txt: b.txt c.txt
cp b.txt a.txt

$< 指代第一个前置条件,即“b.txt”;$@ 指代目标值即“a.txt”

(3)$? ------ 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。

(4)$^ ------ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。

(5)$* ------ 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。

(6)$(@D) 和 $(@F)------ 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。

(7)$(<D) 和 $(<F) ------ 分别指向 $< 的目录名和文件名。

1.3 makefile 循环

Makefile使用 Bash 语法,完成判断和循环。

如ifeq -- else -- endif 使用

ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif

以上代码通过判断编译器是否为gcc决定编译不同的路径。

1.4 makefile 函数

Makefile 提供一些内置函数,使用格式如下:

$(function arguments)
# 或者
${function arguments}

内建函数如下表:具体函数参考路径(https://www.gnu.org/software/make/manual/html_node/Functions.html)

2.mikefile文件编写

如下文件编译一个C语言工程,包含main.c kdb.c display.c 三个源文件及defs.h、command.h、两个头文件

编译代如下:

edit : main.o kbd.o command.o display.o
cc -o edit main.o kbd.o command.o display.o main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h
cc -c display.c clean :
rm edit main.o kbd.o command.o display.o .PHONY: edit clean

该代码中,清空了输出文件,然后利用gcc编译器编译了三个头文件和两个文件。

本文分享自华为云社区《一文读懂LiteOS中的“makefile”文件(1)----makfile简介》,原文作者:o0龙龙0o 。

点击关注,第一时间了解华为云新鲜技术~

makefile:带你了解一种常用于GNU gcc编译的工具语言的更多相关文章

  1. mysqldump常用于MySQL数据库逻辑备份

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

  2. MySQL提供了以下三种方法用于获取数据库对象的元数据

    MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序,如mysqlshow, mysqldump 用 ...

  3. 一篇文章带你编写10种语言HelloWorld

    0,编程语言排行榜 计算机编程语言众多,世界上大概有600 多种编程语言,但是流行的也就几十种.我们来看下编程语言排行榜,下面介绍两种语言排行榜. Ⅰ TIOBE 指数 该指数每月更新一次,它监控了近 ...

  4. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  5. 请写出5种常见到的runtime exception。

    请写出5种常见到的runtime exception. 解答: NullPointerException:当操作一个空引用时会出现此错误. NumberFormatException:数据格式转换出现 ...

  6. 虚拟化(五):vsphere高可用群集与容错(存储DRS是一种可用于将多个数据存储作为单个数据存储群集进行管理的功能)

    vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...

  7. gcc编译, gdb调试, makefile写法

    //test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...

  8. thymeleaf是用于编写html模版的编程语言(工具语言)

    一.编程语言 用于编写html模版的编程语言. thymeleaf一种命令式和声名式混合的寄生语言. html与thymeleaf的结合是dsl与命令式语言的结合. html与thymeleaf的结合 ...

  9. 51ak带你看MYSQL5.7源码2:编译现有的代码

    从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...

  10. 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)【申明:来源于网络】

    带你开发一款给Apk中自动注入代码工具icodetools(完善篇)[申明:来源于网络] 带你开发一款给Apk中自动注入代码工具icodetools(完善篇):http://blog.csdn.net ...

随机推荐

  1. FSCTF 2023(公开赛道)CRYPTO WP

    RSA 1 1.题目信息 提交格式:FSCTF{你所解出的内容} p=1458769258361 q=4556983871563 e=17 求d 2.解题方法 exp from gmpy2 impor ...

  2. 通过.NET Core CLI 来创建并运行ASP.NET CORE应用程序

    说明: .NET Core 命令行接口 (CLI) 工具是用于开发.生成.运行和发布 .NET Core 应用程序的跨平台工具链. .NET Core CLI 包含在 .NET Core SDK 中. ...

  3. cannot import name '_BindParamClause' from 'sqlalchemy.sql.expression'

    python3.8 安装环境组件正常安装 运行 flask db init 报错 cannot import name '_BindParamClause' from 'sqlalchemy.sql. ...

  4. Python 异常处理:try、except、else 和 finally 的使用指南

    异常处理 当发生错误(或我们称之为异常)时,Python 通常会停止执行并生成错误消息. try 块用于测试一段代码是否存在错误. except 块用于处理错误. else 块用于在没有错误时执行代码 ...

  5. Kubernetes: kube-apiserver 之认证

    kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...

  6. OpenGL 投光物详解

    1. 投光物 继续上一节的流程,到目前为止,我们介绍的都是点光源.但是现实世界中,光源的类型却要相对复杂一些.大概会有这么几种形式:定向光.点光源.聚光等等.  2. 定向光 当一个光源处于很远的地方 ...

  7. linux锁定脚本防止脚本重复运行

    问题描述:设置在定时任务中的脚本一定要注意防止脚本重复执行,要不然会带来一些想象不到的结果. 方式一:使用锁定文件的方式来进行防止脚本重复运行,类似数据库socket文件,但是这种情况有一种弊端就是, ...

  8. 支持向量机SVM:从数学原理到实际应用

    本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念.数学背景到Python和PyTorch的代码实现.文章还涵盖了SVM在文本分类.图像识别.生物信息学.金融预测等多个实际应用场景中的 ...

  9. 【主流技术】详解 Spring Boot 2.7.x 集成 ElasticSearch7.x 全过程(二)

    目录 前言 一.添加依赖 二. yml 配置 三.注入依赖 四.CRUD 常用 API ES 实体类 documents 操作 常见条件查询(重点) 分页查询 排序 构造查询 测试调用 五.文章小结 ...

  10. keepass