Linux的makefile与进度条小程序实践
makefile
- make命令
- 主要功能
- 使用方法
- 常用选项
- makefile文件
- 基本结构
- 使用案例
- 变量定义
- 内置变量(即系统定义的确定变量)
- 伪目标
- 模式规则
- 条件语句
- 注释
- makefile中的常用函数
- 进度条小程序
- 创建文件
- 编辑.h文件
- 编辑.c文件
- 创建main函数
- makefile文件
- 执行效果
make命令
在linux中,make 是一个自动化构建工具,主要用于管理和控制项目的编译过程。它通过读取 Makefile(makefile) 文件中的规则和指令,自动执行所需的命令,以便构建可执行程序、库或其他文件。
主要功能
自动化构建:通过简单的命令(如 make),make 可以根据 Makefile 中的定义自动完成编译和链接过程。
处理依赖关系:make 会检查文件之间的依赖关系,只重新编译那些已更改的源文件,节省时间和资源。
多平台支持:make 是一种标准工具,可以在不同的 Unix-like 系统上使用。
使用方法
基本的 make 命令格式如下:
make [target]
target:要构建的目标。如果不指定目标,make 默认构建第一个目标。
常用选项
-f FILE:指定使用的 Makefile 文件,默认是 Makefile 或 makefile。
-j N:并行构建,N 是并行执行的任务数量。
-k:即使某个目标构建失败,也继续构建其他目标。
-n:显示将要执行的命令,但不实际执行。
-B:强制所有目标重新构建。
makefile文件
在 Makefile 中,语法结构相对简单,主要包括目标、依赖关系和命令。以下是一些基本语法元素:
基本结构
Makefile 的基本结构由规则、目标、依赖和命令组成:
target: dependenciescommand
target:要生成的文件或目标,可以是可执行文件、对象文件等。
dependencies:生成目标所依赖的文件列表。
command:用于生成目标的命令,必须TAB 开头。
使用案例
# 一个简单的示例 MakefileCC = gcc # 指定编译器
CFLAGS = -Wall -g # 编译选项# 定义目标
all: myprogram# 规则
myprogram: main.o utils.o$(CC) $(CFLAGS) -o myprogram main.o utils.o# 依赖规则
main.o: main.c$(CC) $(CFLAGS) -c main.cutils.o: utils.c$(CC) $(CFLAGS) -c utils.c# 清理命令
clean:rm -f myprogram *.o
变量定义
变量可以使用 = 或 := 定义:
VAR = value # 延迟赋值
VAR := value # 立即赋值
变量在命令中可以用 $(VAR) 访问
:
$(CC) $(CFLAGS) -o myprogram main.o utils.o
内置变量(即系统定义的确定变量)
$@:目标文件的名称。
$<:第一个依赖文件的名称。
$^:所有依赖文件的名称。
伪目标
伪目标在 Makefile 中是一种特殊的目标,通常用于执行一些不会生成实际文件的命令,如清理、安装等。伪目标不依赖于文件的存在或更新,它们的存在主要是为了便于管理和执行特定的操作。
1. 伪目标的定义
伪目标通常使用 .PHONY 关键字进行声明,尽管在现代的 Make 工具中,即使不使用 .PHONY,伪目标仍然可以正常工作,但为了确保无论目标文件是否存在,命令都能被执行,建议声明它们为伪目标。
.PHONY: clean install
2. 用法示例
2.1 清理目标
清理目标是最常见的伪目标之一,用于删除生成的文件,如可执行文件和中间文件:
.PHONY: cleanclean:rm -f myprogram *.o
在这个示例中,运行 make clean 将会执行 rm -f myprogram *.o 命令,清除生成的文件。
2.2 安装目标
安装目标通常用于将编译好的文件复制到系统的某个目录:
.PHONY: installinstall:cp myprogram /usr/local/bin/
运行 make install 将把可执行文件复制到 /usr/local/bin/ 目录。
2.3 其他常用伪目标
all:通常是默认目标,表示构建所有需要的目标。
test:用于运行测试。
.PHONY: all testall: myprogramtest:./run_tests.sh
3. 伪目标的优点
独立于文件:伪目标不依赖于文件的存在,因此即使与目标同名的文件存在,也不会影响命令的执行。
提高可读性:伪目标使得 Makefile 更加清晰,便于维护和理解。
灵活性:可以根据需要定义任意数量的伪目标,以实现不同的功能。
4. 注意事项
尽管使用伪目标非常方便,但要注意确保每个伪目标的命令是无状态的,也就是说,每次执行该命令都应该产生相同的结果。
在定义伪目标时,应避免与实际文件名冲突,虽然不会影响功能,但可能会造成混淆。
模式规则
模式规则是 Makefile 中的一种强大特性,允许用户定义一组规则,用于处理一类文件的生成。这种规则通过模式匹配来简化和自动化构建过程,尤其是在处理大量文件时非常有效。
1. 什么是模式规则
模式规则的基本形式是:
pattern: prerequisitesrecipe
其中,pattern 是一个带有通配符的模式,可以使用 % 来匹配任何字符串。
2. 模式规则的语法
% 可以代表零个或多个字符。
模式规则的目标可以是多种类型的文件。
通常用于生成目标文件,例如从源文件生成对象文件。
3. 例子
3.1 基本示例
假设我们有多个 C 源文件,想要编译成相应的对象文件,可以使用如下模式规则:
%.o: %.cgcc -c $< -o $@
%.o 是目标模式,表示任意以 .o 结尾的文件。
%.c 是先决条件模式,表示任意以 .c 结尾的文件。
$< 是第一个先决条件,表示与目标匹配的源文件。
$@ 是当前目标的名字。
当你运行 make 并且有 file1.c 和 file2.c 时,Make 会自动生成 file1.o 和 file2.o。
3.2 多文件规则
可以使用模式规则一次性处理多个文件:
OBJ = file1.o file2.o file3.oall: $(OBJ)%.o: %.cgcc -c $< -o $@
在这个例子中,make all 会依次处理 file1.c、file2.c 和 file3.c,生成对应的对象文件。
4. 复合模式规则
可以在同一规则中定义多个目标。例如:
program: main.o utils.ogcc $^ -o program%.o: %.cgcc -c $< -o $@
这里,program 依赖于 main.o 和 utils.o,而 %.o: %.c 模式规则则用于生成这些对象文件。
条件语句
Makefile 支持条件语句,可以根据不同条件选择执行的命令:
1. ifeq
ifeq 用于判断两个字符串是否相等。
ifeq (条件1, 条件2)# 如果条件1 和 条件2 相等,执行的命令
endif
示例:
VAR = valueifeq ($(VAR), value)MESSAGE = "VAR is value"
elseMESSAGE = "VAR is not value"
endif
2.ifneq
ifneq 用于判断两个字符串是否不相等。
ifneq (条件1, 条件2)# 如果条件1 和 条件2 不相等,执行的命令
endif
示例:
VAR = valueifneq ($(VAR), other_value)MESSAGE = "VAR is not other_value"
endif
3. ifdef
ifdef 用于判断一个变量是否已定义。
ifdef VAR# 如果 VAR 已定义,执行的命令
endif
示例:
ifdef VARMESSAGE = "VAR is defined"
elseMESSAGE = "VAR is not defined"
endif
4. ifndef
ifndef 用于判断一个变量是否未定义。
ifndef VAR# 如果 VAR 未定义,执行的命令
endif
示例:
ifndef VARMESSAGE = "VAR is not defined"
endif
注释
注释以 # 开头,make 会忽略这一行的内容:
# 这是一个注释
makefile中的常用函数
常用的函数,可以帮助处理变量、文件和字符串等。下面是一些常见函数的语法和用法:
1. wildcard
语法: $(wildcard pattern…)
用途: 返回匹配模式的所有文件名。
示例:
SRCS = $(wildcard *.c)
这将把当前目录下所有的 .c 文件名存入 SRCS 变量中。
2. patsubst
语法: $(patsubst pattern, replacement, text)
用途: 将 text 中所有匹配 pattern 的部分替换为 replacement。
示例:
OBJS = $(patsubst %.c, %.o, $(SRCS))
这将把 SRCS 中的 .c 文件名转换为 .o 文件名。
3. subst
语法: $(subst find, replace, text)
用途: 在 text 中替换所有 find 字符串为 replace 字符串。
示例:
NEW_VAR = $(subst foo, bar, foo_baz)
NEW_VAR 的值将是 bar_baz。
4. filter
语法: $(filter pattern…, text)
用途: 从 text 中筛选出与 pattern 匹配的单词。
示例:
SRC_FILES = file1.c file2.c file3.h
C_FILES = $(filter %.c, $(SRC_FILES))
C_FILES 将只包含 file1.c 和 file2.c。
5. filter-out
语法: $(filter-out pattern…, text)
用途: 从 text 中排除与 pattern 匹配的单词。
示例:
SRC_FILES = file1.c file2.c file3.h
C_FILES = $(filter-out %.h, $(SRC_FILES))
C_FILES 将只包含 file1.c 和 file2.c。
6. sort
语法: $(sort list)
用途: 对 list 中的单词进行排序,并去重。
示例:
FILES = b.c a.c c.c a.c
SORTED_FILES = $(sort $(FILES))
SORTED_FILES 将是 a.c b.c c.c。
7. join
语法: $(join list1, list2)
用途: 将两个列表合并为一个列表,按空格分隔。
示例:
A = a1 a2
B = b1 b2
C = $(join $(A), $(B))
C 将是 a1 b1 a2 b2。
8. shell
语法: $(shell command)
用途: 执行 shell 命令并返回其输出。
示例:
CURRENT_DIR = $(shell pwd)
CURRENT_DIR 将是当前工作目录的路径。
9. addprefix
语法: $(addprefix prefix, names…)
用途: 在 names 的每个元素前添加 prefix。
示例:
OBJS = $(addprefix obj/, $(SRCS))
如果 SRCS 是 file1.c file2.c,那么 OBJS 将是 obj/file1.c obj/file2.c。
10. addsuffix
语法: $(addsuffix suffix, names…)
用途: 在 names 的每个元素后添加 suffix。
示例:
FILES = $(addsuffix .bak, $(SRCS))
这将把每个源文件名后加上 .bak 后缀。
进度条小程序
创建文件
使用touch创建各种文件
编辑.h文件
写出两个版本的进度条的进度条函数,v1版本是单纯的进度条函数,用来测试进度条逻辑,v2版本则用来实际使用,all为总进度,now为当前进度,以此判断进度条的位置。
编辑.c文件
1,创建bar进度条,用=代表进度,长度为101,包含\0
2,创建进度百分比,显示到了什么程度
3,创建进度圈圈,以str中的字符不断变化代表函数在执行,有时进度太慢进度条不动,实际是在执行的
4,\r代表从头打印
5,fflush函数刷新缓冲区打印进度条
6,usleep函数休眠控制速度
创建main函数
1,all代表总进度
2,speed代表网速
3,now代表现在下载量
makefile文件
@代表隐藏命令,但是命令会执行
1,第一条代表将.o文件链接成可执行文件
2,第二条代表将.c文件都生成.o文件
3,第三条clean清理生成的文件
4,test展示生成的文件
执行效果
相关文章:
Linux的makefile与进度条小程序实践
makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中ÿ…...
latex写作基础
参考:https://www.bilibili.com/video/BV1ku4y1X7Rz 在线latex:https://cn.overleaf.com/ tex文件基本结构 \documentclass{article} % 文档类型,%是注释\usepackage{graphicx} % 导入各种包,这里是graphicx包\titl…...
Chromium HTML5 新的 Input 类型email对应c++
一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...
嵌入式Linux的AXI平台(platform)驱动教程
本文以JFMQL100的Linux系统的AXI接口的平台驱动为例,介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台(platform)驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…...
什么是Java策略模式?与Spring的完美结合
文章目录 什么是策略模式?策略模式的组成部分: 策略模式的示例在Spring中的妙用1. 使用Spring配置2. 在上下文中选择策略3. 动态切换策略 总结推荐阅读文章 在软件设计中,策略模式是一种非常常见的设计模式,它能够让算法的变化独立…...
[Go实战]:HTTP请求转发
前言 在Web应用开发中,请求转发是一项核心且常见的功能,用于负载均衡、服务拆分、路由重定向和业务逻辑处理。通过在Go语言中封装一个通用的HTTP请求转发方法,我们可以简化代码结构,提升可读性、可维护性和可扩展性。本文将探讨如…...
【C++单调栈 贡献法】907. 子数组的最小值之和|1975
本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 由于答案可能很大,因此 返回答案模 109 7 。 示例 1&#x…...
极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
Django 5 增删改查 小练习
1. 用命令创建目录和框架 django-admin startproject myapp cd myapp py manage.py startapp app md templates md static md media 2. Ai 生成代码 一、app/models.py from django.db import modelsclass Product(models.Model):name models.CharField(max_length255, verb…...
【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)
I2C主从机通信(中断、DMA) 文章目录 I2C主从机通信(中断、DMA)1、STM32的I2C介绍2、I2C模式3、STM32 I2C 数据包错误检查4、STM32 I2C 错误情况5、STM32 I2C中断6、STM32 I2C 主发送和接收(Tx 和 RX)6.1 I2C 轮询模式6.2 I2C 中断模式6.3 I2C DMA 模式6.4 STM32 I2C 设备…...
基于SSM+小程序的旅游社交登录管理系统(旅游4)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理&a…...
高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收器? 我回答: 1. Serial收集器 特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即St…...
Java-内部类
个人主页 学习内部类(Inner Class)是Java编程中一项重要且强大的特性,它允许你在一个类的内部定义另一个类。内部类提供了一种将逻辑上相关的类组织在一起的方式,增加了代码的封装性和可读性。接下来带领大家进入內部类的学习。 …...
flutter集成极光推送
一、简述 极光推送,英文简称 JPush,免费的第三方消息推送服务,官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…...
D. Skipping 【 Codeforces Round 980 (Div. 2)】
D. Skipping 思路: 注意到最佳策略是先往右跳转到某处,然后按顺序从右往左把没有遇到过的题目全部提交。 将从 i i i跳转到 b [ i ] b[i] b[i]视为通过边权(代价)为 a [ i ] a[i] a[i]的路径,而向左的路径边权都是 0 0 0;目的是找到到从出发…...
【golang】学习文档整理
Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期...
动态规划-子序列问题——1218.最长定差子序列
1.题目解析 题目来源:1218.最长定差子序列——力扣 测试用例 2.算法原理 1.状态表示 本题可以看作是寻找一个等差序列,并且公差给出,这里并不是普通的使用一个dp表,而是将arr与dp表同时存储于一个哈希表,arr[i]映射dp…...
双子塔楼宇可视化系统:提升建筑管理与运营效率
利用图扑可视化技术对双子塔楼宇的各项功能进行实时监控和管理。通过数据分析优化资源配置,提高能源效率,增强楼宇安全性,实现智能化运营。...
32位的ARMlinux的4字节变量原子访问问题
在32位的ARM Linux内核中,4字节整型变量通常被认为是原子操作。 这主要是因为: 对齐要求:在ARM架构中,4字节整型变量通常是按4字节对齐存储的,这样可以确保在读取和写入时,CPU能够以单个指令完成操作。 …...
用哪种建站程序做谷歌SEO更容易?
做网站很容易,但做一个能带来流量和订单的网站就没那么简单了。尤其是在谷歌SEO优化方面,不同的建站程序对SEO的支持程度也不同。在这方面,WordPress和Shopify无疑是最佳选择。 WordPress作为一个内容管理系统(CMS)&am…...
IPsec简单介绍
VPN相关介绍 VPN:虚拟私有网络 例如:像这种不加密的 PPTPL2TP ------- 一般用在windows server 服务端(但是大多数企业不用这个) 假如总公司内部的PC1要去访问分公司内部的PC2(一般用在公司服务器有内网的服务&#…...
颠覆级AI:10秒生成超清视频
颠覆级AI:10秒生成超清视频 Pyramid-Flow 是一款开源 AI 视频生成神器💻,只需文字或图片即可极速生成高清视频🎥!高效、高清、资源需求低,适合创作广告、教学视频等多种用途🚀,快来…...
《西安科技大学学报》
《西安科技大学学报》主要刊载安全科学与工程、矿业工程、建筑与土木工程、地质与环境工程、测绘工程、材料科学与工程、化学与化工、机械工程、电气工程及自动化、通信与信息工程、计算机科学与工程、矿业经济管理等专业领域内具有创新性的学术论文和科研成果。 来稿必须符合以…...
redis详细教程(2.List教程)
List是一种可以存储多个有序字符串的数据类型,其中的元素按照顺序排列(可以重复出现),可以通过数字索引来访问列表中的元素,索引可以从左到右或者从右到左。 Redis 列表可以通过两种方式实现:压缩列表&…...
电子电气架构 --- 电气系统工程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
15-4连续子串和的整除问题
问题描述 小M是一个五年级的小学生,今天他学习了整除的知识,想通过一些练习来巩固自己的理解。他写下了一个长度为 n 的正整数序列 a_0, a_1, ..., a_{n-1},然后想知道有多少个连续子序列的和能够被一个给定的正整数 b 整除。你能帮小M解决这…...
Spring源码:Bean创建、Bean获取
Bean是怎么被创建,如何获取Bean,基于Spring 5.3.24版本,Spring Boot 可用 2.7.6 结论: 创建:非懒加载的单实例bean在容器创建的时候创建,通过beanFactory的doGetBean方法,利用反射进行创建&…...
MetaArena推出《Final Glory》:引领Web3游戏技术新风向
随着区块链技术的日益成熟,Web3游戏成为了游戏产业探索的新方向,将去中心化经济与虚拟世界结合在一起,形成了一个全新的生态体系。然而,尽管Web3游戏展示了令人兴奋的可能性,但其背后的技术障碍依旧严峻,特…...
玩转Shodan:深度挖掘特定漏洞与脆弱资产的实战技巧
内容预览 ≧∀≦ゞ Shodan进阶使用之发现并解锁隐藏的脆弱资产声明导语VNC未授权访问查询被黑的网站查询思科未授权设备查询MongoDB未授权访问搜索后台管理页面结语 Shodan进阶使用之发现并解锁隐藏的脆弱资产 声明 笔记内容参考了B站UP主泷羽sec的学习视频,如有侵…...
Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2
目录 1 环境整合配置 2 Swagger2 常⽤注解说明 2.1 Api 2.2 ApiOperation 2.3 ApiImplicitParams 2.4 ApiResponses 2.5 ApiModel 3 用户模块注解配置 3.1 Controller 使用注解 3.2 JavaBean 使用注解 4 Swagger2 接⼝⽂档访问 由于 Spring Boot 能够快速开发、便捷…...
营销型网站的三元素/seo关键词优化方法
将以下代码复制粘贴到txt文件中,另存为bat格式,并将文件编码格式修改为ANSI,跟要处理的文件放一个文件夹内运行。 代码中制定的是删除1,2行,可根据需求自行修改。 echo off rem 根据指定的行号范围删除多个txt文件里的连续多行内…...
天津电商网站建设/市场营销网络
在此示例中,您可以获取网页上所有出现的电子邮件地址。 如果您必须更改站点的特定页面或子部分的电子邮件地址,则很有用。 也可能对从网页上筛选爬网电子邮件地址有用,尽管这不是我在这里要实现的目标。 查看更多jQuery .each示例 。 i 不敏感…...
网络营销内容有哪些方面/seo网站排名推广
问题: 项目中 前端传JSON数据到后端接口时 数据尾部多了一个等于号 解决办法: 前端 设置请求体类型 以及 数据格式 后端也要指定 接受数据 的格式 在写前后端接口的时候,我的前端将表单的数据封装后转成JSON格式 想着传到后端来解析一波 前端…...
网站门户是什么意思/百度没有排名的点击软件
两个可能的病毒现象求助!一 我在公司局域网上的计算机近来发现启动IE或者其他程序明显变慢,后检查发现如果关掉网络连接就正常了,打开连接后问题又出现了,不知何故,如何解决?(win2k sp4)二 我的家里的计算机…...
eclipse做购物网站/福州seo技术培训
对于刚开始学QT的同学,在网上搜索许久之后会发现:一个简 单的 Qt 程序下面这个小程序,估计大家会感到比较亲切。似乎有相当多的中文用户尝试写过这样的代码:#include #include int main(int argc, char **argv){QApplication app(…...
wordpress 添加百度统计/佛山seo关键词排名
建筑模型设计制作实践室带锯、圆盘锯安全操作规程一、开机前1、检查锯齿是否变钝,固定锯片的螺丝是否坚固,锯条是否绷紧适中。2、接通电源,检查转动方向是否正确。3、根据锯切需要,调整锯条、档板等至合适位置,做好锯切…...