首页 > 其他分享 >MakeFile文件的使用 [补档-2023-07-13]

MakeFile文件的使用 [补档-2023-07-13]

时间:2024-01-13 16:36:55浏览次数:29  
标签:文件 13 07 makefile MakeFile two 目标 main 变量

makefile-gdb文件

​ 可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译。他可以自动化编译程序。。。。

6-1 makefile基本规则

​ 如下:

目标: 依赖

(tab) 命令

​ 规则三要素:

目标:要生成的目标文件。

依赖:目标文件由那些文件生成。

命令:执行命令以便生成目标。

例子: makefile的第一种写法:

​ 这样写的效率最低,修改一个文件时,所有文件都会重新编译。

6-2 makefile的工作原理

​ 如果想要生成目标,则检查规则中的依赖是否都存在,如果不存在向下寻找,看看有没有生成该依赖文件 的规则,如果有则先生成该依赖,然后再回到刚才的地方生成目标。如果没有则报错

​ 如果想要生成目标的依赖都存在,则检查规则中的目标是否要更新,而且要先检查该目标的依赖是否有更 新,如果有则必须更新该目标。也就是依赖比目标新 更新目标文件

例子:makefile的第二种写法:

​ 上图中,如果要生成可执行文件main则需要满足四个依赖,很显然在第一行四个依赖都不满足,于是向 下寻找缺少的依赖是否也需要被生成。然后就发现main的依赖之一main.o需要又一个依赖main.c来生成。 然后生成main.o文件。以此类推。上图代码过于冗余,不建议怎么写。

6-3 makefile中的变量

​ makefile中有三种变量:普通变量,自带变量,自动变量。

普通变量

​ 定义变量时使用“=

​ 使用变量时应该这样:$(变量名)

​ 例子:

​ acr = test.txt //定义变量acr并且为其赋值

​ bar = $(test.txt) //定义变量baar,并且使用之前的acr变量为其赋值

​ makefile中有一些固定的变量可以让用户直接使用,我们可以为其赋值。

CC = gcc #arm-linux-gcc

CPPFLGS : //C预处理的选项 -I (大写i)

CFLGS: //C预编译的选项 -Wall -g -c

LDFLAGS: //链接器选项 -L -l

自动变量:(只能在规则的命令中使用)

$@: 表示规则中的目标

$<: 表示规则中的第一个条件

$^: 表示规则中的所有条件,组成一个列表,以空格分隔开,如果列表中有相同项这会消除相同项。

模式规则:

​ 至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的 取值取决于其目标:

​ 比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c

例子:markfile文件的第三种写法:

​ 上图markfile文件解析:

​ 1.定义一个变量target 并且为其赋值为main(main是可执行程序的名字)

​ 定义一个变量object 并且为其赋值。(赋值内容为main的依赖条件)

​ 使用自带的CC变量,并且为其赋值。

​ 使用自带的CPPFLAGS变量,并且为其赋值。(这个变量是 预处理-I的那个参数)

​ 2.$(target) : $ (object) 这里是使用变量。

​ 上述内容展开后如下:main:main.o fun1.o fun2.o sum.o

​ 3.$(CC) -o $@ $^ 这里先使用了CC变量,然后使用自带变量$@表示当前规则中的目标,也就是object 变量的值,$^表示要逐个取用规则中的目标,如果有重复则消除重复。

​ 上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o

​ 4.%.o:%.c 这里表示生成一个或多个.o目标文件需要一个或多个%.c依赖

​ 5.$(CC) -o $@ -c %< $(CPPFLAGS) 这个不多说,我们直接展开

​ 上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o -c main.c fun1.c fun2.c sum.c

6-4 makefile函数

​ 以下是常见函数:

​ 1.wildcard 查找指定目标下的指定类型的文件,例如:scr=$(wildcard *.c) 可以将当前目录下所以后缀为.c的文件赋值给src。

​ 2.patsubst 匹配替换,例如:obj=$(patsubst %.c,%.o,$(src)) 把变量src中所有后缀为.c的文件替换成.o。

​ 通过以上代码,发现这里的函数也会有返回值。

例子:markfile的第四种写法:

​ 上图的makefile文件的解析:

​ 现在假设当前目录想有源文件one.c 和 two.c

​ 1.src=$(wildcard ./*.c) 这里使用wildcard来搜索当前目录下的所有后缀为.c的文件,并且将其赋值给 src。此时src等于oen.c two.c

​ 2.object=$(patsubst %c,%.o,$(src)) 这里通过patsubst;来将变量src中所有.c替换为.o,替换完成后变 量src的值为 one.o two.o

​ 3.定义一个普通变量target,并且为其赋值为main

​ 4.使用自带的CC变量CPPFLAGS变量,并且为其赋值

​ 5.$(target)

标签:文件,13,07,makefile,MakeFile,two,目标,main,变量
From: https://www.cnblogs.com/xiaobai1523/p/17962495

相关文章

  • 2024.1.13-每日进度笔记
    今天,主要尝试了在java中调用已有的python脚本并输出相关信息。 参考:百度文心一言的回复。 packagetest0113;importjava.io.*;publicclasstest{publicstaticvoidmain(String[]args){try{//指定Python解释器的路径S......
  • Linux下的gcc/g++编译器的使用 [补档-2023-06-13]
    gcc编译器​这东西是Linux上的c/c++编译器。5-1gcc的工作流程5-2gcc的常用参数-v查看gcc版本号,--version也可以-E生成预处理文件-S生成汇编文件-c只编译,生成.o文件,通常称为目标文件-I指定头文件所在的路径-L指定库文件所在的路径-l指定库的名......
  • 2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能
    2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,每一个技能会有一个伤害,同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,每一个技能最多只能释放一次,已知怪物有m点血量。现在想问你最少用几个技能能消灭掉他(血量小于等于0)。技能的数量是n,怪物的血......
  • 2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能
    2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,每一个技能会有一个伤害,同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,每一个技能最多只能释放一次,已知怪物有m点血量。现在想问你最少用几个技能能消灭掉他(血量小于等于0)。技能的数量是n,怪......
  • Linux系统的一些实用操作 [补档-2023-07-30]
    Linux的实用操作4-1.常用快捷键强制停止:当某些程序运行时,或者命令输入错误时,可以通过ctrl+c来强制结束当前的操作。退出或登出:当我们要退出某些用户时,或者要退出某些特殊的页面可以使用ctrl+d来进行。(vi/vim不可用)历史命令搜索:通过输入history命令来查看之前输入......
  • Linux的用户和权限 [补档-2023-07-07]
    Linux用户和权限3-1.su用户切换命令exit用户退出命令​用户切换命令的语法:​su[-][用户名]​其中:​-可选,表示是否在切换用户后加载环境变量,建议带上。​用户名可选,表示要切换到那个用户,如果不填则默认切换到root用户上。​......
  • vi / vim编辑器的使用 [补档-2023-07-01]
    vi/vim编辑器​vi/vim编辑器是linux中的文本编辑器,其中vim比vi的功能更加强大,可以编辑shell程序,推荐使用vim,下面也将介绍vim如何使用。2-1vi/vim的三种工作模式命令模式​在此模式下,所敲的每一个键都是一个命令,不可以进行文本编辑。比如输入w代表保存等待。输入......
  • 13.Mock 的价值与意义
    目录 Mock测试的场景Mock测试的价值与意义Mock核心要素Mock测试的场景 前后端数据交互第三方系统数据交互硬件设备解耦Mock测试的价值与意义 不依赖第三方数据节省工作量节省联调Mock核心要素 匹配规则模拟响应......
  • 【ubantu22.10】安装部署timescaledbv2.13.0及postgresql v14.10
    一、安装部署postgresql-timescaledbaptinstallgnupgpostgresql-commonapt-transport-httpslsb-releasewget二、运行postgresql存储库设置脚本/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh三、添加timescaledb第三方存储库echo"debhttps://packageclo......
  • 07. HTTP接口请求重试怎么处理?
     目录1、前言2、实现方式2.1、循环重试2.2、递归重试2.3、SpringRetry2.4、Resilience4j2.5、http请求网络工具内置重试方式2.6、自定义重试工具2.7、并发框架异步重试2.8、消息队列3、小结1、前言HTTP接口请求重试是指在请求失败时,再次发起请求的机制。在实际应用中,由于网络波动......