Makefile:常用知识点总结

本文详细介绍了Makefile的基本概念,包括规则、GCC与make自动推理、makefile内容结构、命令书写与执行、错误处理、变量使用、环境变量、模式变量、条件判断及函数应用。通过实例演示如何使用Makefile控制项目构建过程。


https://download.csdn.net/download/Shawn_Ch/12250282

0 makefile

Makefile是控制“ make”命令的文件。 Make在几乎每个平台上都可用,并用于控制项目的构建过程。 为项目编写Makefile之后,make可以轻松高效地构建项目并创建所需的输出文件。

0.1 规则

在这里插入图片描述
prerequisites中如果有一个以上的文件比target要新的话,command所定义的命令就会被执行。这个就是makefile中最核心的内容。

0.2 GCC&make自动推理

gcc [option] filename
在这里插入图片描述可以直接输入文件来输出可执行文件,其中命令必须要用tab开头
在这里插入图片描述
当然也可以不输入.c文件,只要输入.o文件那么make就可以推理到.c文件。
在这里插入图片描述

0.3 makefile内容

显式规则
隐晦规则
变量定义:makefile中的变量有点像c语言中的宏,做了一个替换。
文件指示:引用别的makefile。格式为 include
注释

1 书写命令

1.1 显示命令

@echo

1.2 命令执行

如果需要两条指令连续执行,那么他们之间用分号隔开。
cd ./tools ;pwd

1.3 命令出错

执行过程中有可能出错,出错的话就会停止执行,所以需要在命令前加上“-”表示不管执行成功与否都继续执行。

2 变量

2.1 变量使用

变量的基础

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
makefile中“=”、“:=”、“+=”的区别。
https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

=
是把整个makefile都执行完之后的赋值
:=
覆盖之前的值
+=
两边的值相加,再赋值

?=

?= &esmp;//表示模块如果没有被定义的话,就定义。
JOB ?= $(job)//大小写通用。
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。

override

如果定义了变量不想让Make命令行改变,可以在前面加override

OBJS = hello.c
override value1 = "this is a this is a test of override"
main: 
        @echo "start gcc"
        gcc -o hello ${OBJS}
        @echo ${value1}
.PHONE: clean

clean:
        rm hello.o

执行

make value1=hello

此时value1的值不会改变。

多行变量

define two-lines

endif

这个功能可以定义一系列的函数变量等。

2.2 环境变量

  Make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中,但是如果 Makefile 中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变量的值将被覆盖。(如果 make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefile中定义的变量)。
  很像“全局变量”和“局部变量”的特性。
  MAKECMDGOALS:在命令行中指定Target,不指定则为空。

2.3模式变量

3 条件判断

3.1 ifeq

让make在运行时选择不同的分支。

value2 = "1"
value3 = "1"
ifeq "${value3}" "${value2}"
main:  hello.o
        @echo "start gcc"
        gcc -o hello ${OBJS}
        @echo ${value1}
endif

如果两值相等,那么才会执行。

3.2 ifdef

4 函数

4.1 字符串处理函数

subset

功能:进行字符串替代。
使用方法: $(subset from , to ,string)

patsubset

功能:进行模式字符串的替换,类似通配符的方法。

strip

去掉空格。strip为脱掉之意。
ifeq ($strip $(HELLO)),TRUE)
如果定义了HELLO = TRUE那么,以上函数由上一个makefile传递过来。

findstring

功能:查找字符串函数。$(find a ,a b c)//在abc中查找a。

filter

功能:过滤函数

filter-out

功能:反过滤函数,输出的是不符合要找的pattern的字符串。

sort

功能:给字符串中的单词,按照单词的升序进行排序。

3.2 文件名处理函数

3.3 foreach

功能:从名字就可以看出,这是一个循环函数,类似C中的for。
示例:names := a b c d
   files := $(foreach n, $(names), $ (n).o)

//把names中的每一个放入n中。然后再执行后面的$(n).o

3.4 origin

功能:origin,起源。这个函数返回变量的起源信息。

3.5 if

功能:判断函数。
示例: $(if condition, do,else do).

4 Make的运行

待补充。

实例

make project=项目名称 new job=4 -j4

其中 除了前面加-的是make自己的命令,其他的都是变量, p=“项目名称"意思是给p这个变量赋值为"项目名称”,然后在mk中就可以进行按照工程名字进行执行了。

1. STM32F103C8T6: 这是一款基于ARM Cortex-M3内核的32位微控制器,主要由STMicroelectronics公司生产。它具有高性能、低功耗的特点,广泛应用于工业控制、医疗设备、汽车电子等领域。STM32F103C8T6具有丰富的外设接口,包括ADC、DAC、UART、CAN等,使其具有强大的扩展性和适应性。2. ATT7022E: 这是一款三相电能专用计量芯片,主要用于电能的测量和计算。它可以精确测量电压、电流、有功功率、无功功率、功率因数、频率等电参数,广泛应用于智能电表、电力质量分析等领域。ATT7022E具有高精度、高稳定性的特点,可以满足各种电能测量的需求。3. HT7036: 这是一款电力线通信芯片,主要用于电力线通信和数据传输。它可以将数据通过电力线进行传输,从而实现远程数据传输和控制。HT7036具有高稳定性和高抗干扰性,可以在复杂的电力线环境中稳定工作。4. 硬件参考设计PDF原理图: 这是一份详细的硬件设计图,展示了如何将STM32F103C8T6、ATT7022E和HT7036等芯片连接在一起,实现电能测量和电力线通信的功能。通过阅读和理解这份原理图,可以更好地理解硬件的工作原理和设计方法。5. 数据手册: 这是一份详细介绍芯片特性和使用方法的文档。通过阅读数据手册,可以了解到芯片的工作电压、工作电流、封装尺寸、引脚定义等信息,为芯片的使用和设计提供参考。6. ATT7022EU模块软件源码: 这是一份包含ATT7022E模块使用方法和例程的源码。通过阅读和运行这些源码,可以更好地理解ATT7022E模块的工作原理和使用方法,为软件的开发和调试提供参考。7. 三相电能专用计量芯片: 这是一种专门用于三相电能测量的芯片,它可以在复杂的三相电路中精确测量各种电参数,广泛应用于电力系统、工业控制等领域。通过阅读和理解这份资源,可以深入了解STM32F103C8T6、ATT7022E和HT7036等芯片的工作原理和应用方法,为电力系统的电能测量和数据传输提
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值