make和makefile的使用,以及写一个简单的进度条程序

1.自动化构建-make/makefile

1.1 背景

  • 一个工程文件中的文件不计其数,其按类型、功能、模块放在若干目录中,makefile定义了一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于过呢更复杂的功能操作。
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make指令,整个工程完全自动编译
  • make是一个指令,makefile是一个文件,两个搭配使用完成项目自动化构建

1.2基本使用

#include <stdio.h>
int main()
{printf("hello world\n");return 0;
}

Makefile文件

test:test.cgcc test.c -o test.PHONY:clean
clean:rm -f test
  • 依赖关系:上面的文件test,依赖test.c
  • 依赖方法:gcc test.c -o test 就是对应的依赖方法
  • 项目清理
    1.工程时需要清理的
    2.向clean这种没有被第一个目标文件直接或间接关联,那么他后面所对应的命令将不再被自动执行,不过我们可以显示要make执行即命令“make clean”来清理目标文件
    3.但是一般我们这种clean的目标文件,我们将他设置为伪目标用.PHONY修饰,伪目标的特性是:总是被执行的

1.3 make是如何工作的

test:test.ogcc test.o -o test
test.o:test.cgcc -c test.c -o test.o.PHONY:clean
clean:rm -f *.i *.s *.o test

在这里插入图片描述

  1. make会在当前目录下寻找名字为"Makefile"或“makefile”的文件。
  2. 如果找就会找文件中的第一个目标文件。
  3. 如果test文件不存在或是test所依赖的后面的test.o文件的修改时间要比这个test新,那么就会执行后面所定义的命令来生成test这个文件。
  4. 如果test依赖的test.o文件不存在,那么make会在当前文件寻找test.o的依赖性,如果找到则根据规则生成一个test.o文件。
  5. 当然.c文件.h存在于是make会生成test.o文件然后在用.o文件生成目标文件。
  6. 这就是make的依赖性,make会一层一层的去找文件的依赖关系。
  7. 在寻找过程中,如果出现错入那么make会直接退出,并且报错。而对于所定义的命令的错误或是编译不成功,make根本不理
  8. make只管文件的依赖性,即在找到依赖关系后,冒号后面的文件还是不在,那么make就不工作了

1.4 适度扩展语法

compling ... test.c to test.o
linking ... test.o to test.exe
[jfs@superg-alicloud test07]$ cat Makefile
BIN=test.exe 			# 定义变量
CC=gcc
#SRC=$(shell ls *.c) 	# 采用shell命令行式,获取当前所有.c文件名
SRC=$(wildcard *.c) 	# 或者使用wildcard函数,获取当前所有.c文件名
OBJ=$(SRC:.c=.o) 		# 将SRC的所有同名.c替换成为.o目标文件列表
LFLAGS=-o 				# 链接选项
FLAGS=-c 				# 编译选项
RM=rm -f 				# 引入命令$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^ 	# $@:代表目标文件名。 $^: 代表依赖文件列表@echo "linking ... $^ to $@"%.o:%.c 				# %.c 展开当前录下所有的.c。 %.o: 同时展开同名.o@$(CC) $(FLAGS) $< 		# %<: 对展开的依赖.c文件,一个一个的交给gcc。@echo "compling ... $< to $@" # @:不回显命令.PHONY:clean
clean:@$(RM) $(OBJ) $(BIN) 	# $(RM): 替换,用变量内容替换它.PHONY:test
test:@echo $(SRC)@echo $(OBJ)

2.Linux简单的系统程序-进度条

通过主函数传递参数模拟下载过程

myproc.h

#pragma once#include <stdio.h>void download(double total, double current, double speed);

myproc.c

#include "myproc.h"
#include <string.h>
#include <unistd.h>#define NUM 101
#define STYLE '-'
void FlushProcess(double total, double current)
{char buffer[NUM];memset(buffer,0,sizeof(buffer));const char* lable="|/-\\";int len = strlen(lable);static int cnt=0;int num = (int)(current*100/total);int i = 0;for(; i < num; i++){buffer[i]=STYLE;}double rate = current*100/total;printf("[%-100s][%.1f][%c]\r",buffer,rate,lable[cnt%len]);cnt++;fflush(stdout);}
void process_v2(double total, double current, double speed)
{while(current <= total){FlushProcess(total, current);usleep(5000);current += speed;}
}void process_v1()
{char buffer[NUM];memset(buffer,0,sizeof(buffer));const char *lable="|/-\\";int len = strlen(lable);int cnt = 0;while(cnt <= 100){printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);fflush(stdout);buffer[cnt]=STYLE;cnt++;usleep(50000);}printf("\n");
}void download(double total, double current, double speed)
{//process_v1();process_v2(total, current, speed);printf("\n download %.2fMB\n",current);
}

main.c

#include "myproc.h"double total = 1024.0;
double current = 0.0;
double speed = 1.0;
int main()
{download(total, current, speed);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构中的栈与队列:原理、实现与应用

前言&#xff1a;栈和队列是计算机科学中两种最基础的线性数据结构&#xff0c;它们的独特操作规则和广泛的应用场景使其成为每一位开发者必须掌握的核心知识。本文将通过生活案例、代码实现和实际应用场景&#xff0c;带您深入理解这两种数据结构的精髓。 1.栈&#xff08;Sta…

如何选择自己喜欢的cms

选择内容管理系统cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 检测器的情况下手动检测 CMS 结论 在开始构建自己的数字足迹之前&#xff0c;大多数人会…

SDC命令详解:使用all_outputs命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于创建一个输出端口对象集合&#xff0c;关于设计对象和集合的更详细介绍&#xff0c;可以参考下面的博客。 Synopsys&#xff1a;设计对象https://chenzhang.blog.csdn…

vue 中的ref

vue 中的ref vue 中的ref 1. ​​ref​​ ** 的基本作用** 在 Vue 中&#xff0c;ref 是用来获取 DOM 元素或者组件实例的一种方式。对于 <el-form> 组件&#xff0c;通过 ref 可以获取到该表单组件的实例&#xff0c;进而调用表单组件提供的各种方法和访问其属性。 …

数据库版本控制工具--flyway

一. 什么是Flyway Flyway 是一款开源的数据库迁移工具。它采用简单直观的方式管理数据库变更&#xff0c;通过版本化的迁移脚本确保数据库结构的一致性和可重复性。无论是开发环境、测试环境还是生产环境&#xff0c;Flyway 都能确保数据库变更按照预期顺序执行&#xff0c;避…

C++使用PoDoFo库处理PDF文件

&#x1f4da; PoDoFo 简介 PoDoFo 是一个用 C 编写的自由开源库&#xff0c;专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序&#xff0c;比如批量生成、修改、合并、提取元数据、绘图等。 &#x1f31f; 核心特点 特性说明&#x1f4c4; P…

论文分享➲ arXiv2025 | TTRL: Test-Time Reinforcement Learning

TTRL: Test-Time Reinforcement Learning TTRL&#xff1a;测试时强化学习 https://github.com/PRIME-RL/TTRL &#x1f4d6;导读&#xff1a;本篇博客有&#x1f9a5;精读版、&#x1f407;速读版及&#x1f914;思考三部分&#xff1b;精读版是全文的翻译&#xff0c;篇幅较…

dify插件接入fastmcp示例

文章目录 1. 使用python完成mcp服务1.1 准备环境&#xff08;python安装fastmcp&#xff09;1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略&#xff08;支持 MCP 工具&#xff09; 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置&#xff…

Linux 挖矿木马排查命令清单

Linux 挖矿木马排查命令清单 1. 系统资源使用情况检查 # 查看CPU、内存使用情况 top -c# 检查CPU占用最高的进程 ps aux --sort-%cpu# 查找可疑进程名 ps -ef | grep -i miner\|cpu\|GPU\|xmr# 检查网络连接情况 lsof -i2. 可疑进程和隐藏进程检查 # 检查僵尸进程 ps -ef | …

PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式

一个简单的矩阵乘法例子来演示在 PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式。 这个例子会展示核心的区别在于如何获取和指定计算设备&#xff0c;以及&#xff08;对于 TPU&#xff09;可能需要额外的库和同步操作。 示例代码&#xff1a; import torch import tim…

自主shell命令行解释器

目标 能处理普通命令能处理内建命令 实现原理 用下面的时间轴来表示时间发生次序。时间从左向右。shell由标识为sh的方块&#xff0c;它随着时间从左向右移动。 shell从用户读入字符串“ls”。shell建立一个新的进程&#xff0c;然后等待进程中运行ls程序并等待进程结束。 …

如何在sheel中运行Spark

启动hdfs集群&#xff0c;打开hadoop100:9870&#xff0c;在wcinput目录下上传一个包含很多个单词的文本文件。 启动之后在spark-shell中写代码。 // 读取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行切…

【入门】数字走向II

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int in;i>1;i--){for(…

Python自动化-python基础(下)

六、带参数的装饰器 七、函数生成器 运行结果&#xff1a; 八、通过反射操作对象方法 1.添加和覆盖对象方法 2.删除对象方法 通过使用内建函数: delattr() # 删除 x.a() print("通过反射删除之后") delattr(x, "a") x.a()3 通过反射判断对象是否有指定…

重新定义高性能:Hyperlane —— Rust生态中的极速HTTP服务器

重新定义高性能&#xff1a;Hyperlane —— Rust生态中的极速HTTP服务器 &#x1f680; 为什么选择Hyperlane&#xff1f; 在追求极致性能的Web服务开发领域&#xff0c;Hyperlane 凭借其独特的Rust基因和架构设计&#xff0c;在最新基准测试中展现出令人惊艳的表现&#xff…

通俗的理解MFC消息机制

1. 消息是什么&#xff1f; 想象你家的门铃响了&#xff08;比如有人按门铃、敲门、或者有快递&#xff09;&#xff0c;这些都是“消息”。 在 MFC 中&#xff0c;消息就是系统或用户触发的各种事件&#xff0c;比如鼠标点击&#xff08;WM_LBUTTONDOWN&#xff09;、键盘输入…

腾讯开源SuperSonic:AI+BI如何重塑制造业数据分析?

目录 一、四款主流ChatBI产品 二、ChatBI应用案例与实际落地情况 三、SuperSonic底层原理 3.1、Headless BI 是什么 3.2、S2SQL 是什么 3.3、SuperSonic 平台架构 四、ChatBI应用细节深挖 五、与现有系统的集成方案 六、部署和安全 七、开源生态、可扩展性与二次开…

AI生成视频推荐

以下是一些好用的 AI 生成视频工具&#xff1a; 国内工具 可灵 &#xff1a;支持文本生成视频、图片生成视频&#xff0c;适用于广告、电影剪辑和短视频制作&#xff0c;能在 30 秒内生成 6 秒的高清视频&#xff08;1440p&#xff09;&#xff0c;目前处于免费测试阶段。 即…

OrangePi Zero 3学习笔记(Android篇)5 - usbutils编译(更新lsusb)

目录 1. Ubuntu中编译 2. AOSP编译 3. 去掉原来的配置 3. 打包 4. 验证lsusb 在Ubuntu中&#xff0c;lsusb的源代码源自usbutils。而OrangePi Zero 3中lsusb的位置可以看文件H618-Android12-Src/external/toybox/Android.bp&#xff0c; "toys/other/lsusb.c",…

bcm5482 phy 场景总结

1,BCM5482是一款双端口10/100/1000BASE-T以太网PHY芯片,支持多种速率和双工模式。其配置主要通过MDIO(Management Data Input/Output)接口进行,MDIO接口用于访问PHY芯片内部的寄存器,从而配置网络速率、双工模式以及其他相关参数。 a,具体以下面两种场景举例 2. 寄存器和…