• 4.5自动构建make/Makefile
      • 4.5.1基本使用
        • 1示例
        • 2进一步解释
        • 3实践
        • 4最佳实践
    • 4.6练习:进度条
      • 4.6.1倒计时
      • 4.6.2进度条version1
      • 4.6.2进度条version2
    • 4.7版本控制器Git
      • 4.7.1git操作
        • 1操作一次,以后不愁
        • 2经典"三件套"
        • 3常用
        • 4版本回退
      • 4.7.2小结

4.5自动构建make/Makefile

make是⼀条命令,Makefile是⼀个文件,两个搭配使用,完成项目自动化构建。

makefile带来的好处就是⸺“自动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全自动编译,极⼤的提高了软件开发的效率。

make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

make命令和makefile文件——依赖关系和依赖方法

4.5.1基本使用

1示例

简述:创建Makefile/makefile文件,写入依赖关系和依赖方法,通过make命令执行。

touch test.c
touch Makefile//test.c
#include<stdio.h>
int main()
{printf("hello world!\n");return 0;
}//Makefile
test.exe:test.c            //依赖关系,test.exe依赖test.cgcc -o test.exe test.c //依赖方法,test.c形成test.exemake
./test.c
2进一步解释
//Makefile
test.exe:test.cgcc -o test.exe test.c

test.exe是目标文件

test.c等是依赖文件列表

依赖关系,test.exe依赖test.c

依赖方法,test.c形成test.exe

二者共同构建可执行目标文件的语义。

形成可执行文件的过程:

//Makefile
test.exe:test.ogcc test.o -o test.exe
test.o:test.sgcc -c test.s -o test.o
test.s:test.igcc -S test.i -o test.s
test.i:test.cgcc -E test.c -o test.i//执行make后
gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -c test.s -o test.o
gcc test.o -o test.exe

make会解析Makefile文件,形成推导依赖关系的推导栈(依赖方法的集合)

依赖方法不存在就入栈,推导成功就执行对应命令出栈

(其实实现过程类似于函数递归的过程)

3实践
//构建
test.exe:test.c@gcc -o test.exe test.c//加上@会禁止命令回显//清理
.PHONY:clean
clean:@rm -f test.exe test.i test.s test.o

PHONY:假的,伪造的

.PHONY:用来修饰目标文件是一个伪目标,.PHONY:修饰的伪目标总是被执行的。

总是被执行的原理是什么?为什么gcc无法二次编译旧代码?

首先我们知道可执行文件是文件,拥有修改时间的属性,而源文件是否需要被重新编译,需要判断源文件修改时间和可执行文件的修改时间谁更新,更接近当前时间;而**.PHONY:可以让gcc或者对应的命令,忽略MOD时间对比新旧。**

关于文件时间:

stat 文件名在这里插入图片描述

(简记ACM时间)

access:文件访问时间

modify:文件内容更改时间

change:文件属性更改时间

了解:

更改文件内容不仅会更新文件内容的时间,还会更新文件属性的时间,因为Mod时间也属于文件属性。

在对文件进行访问时,并不是每次都会更新access时间。原因是:查看文件会更新时间,接着更新文件属性,然后过程会刷新到磁盘(磁盘属于外设,效率比较低),如果每当文件被访问时都会更新时间进行以上过程,会导致OS整体的效率低下。所以为了提高效率会设置为当访问次数达到一定次数时(10,20次等)才会更新时间。

结论

1,依赖关系必须存在,依赖文件列表可以为空

2,依赖方法可以是任何shell命令

3,clean目标,只是利用make的自动推导能力,执行了rm命令,在构建工程的视角,拦起来就是清理项目,即删除不需要的临时建立的文件。

4,make命令,后面可以跟目标名,之后解析推导对应的依赖关系和依赖方法,

默认情况下make只会推导一条完整的推导链路,默认只会推导第一个依赖关系对应的推导链。

5,源文件发生更改才会重新编译!

4最佳实践
//其实类似于宏替换
BIN=test.exe
SRC=test.c$(BIN):$(SRC)@echo "编译开始"@gcc -o $@ $^      @echo "编译完成"
.PHONY:clean
clean:@echo "清理开始..."@rm -f $(BIN)@echo "清理完成..."

问题:如果有多个文件,怎么高效编译?

touch src{1..100}.c该命令意义是创建100个.c后缀文件命名为src1.c、src14.c等

rm src{1..100}.c删除

BIN=test.exe
//SRC=$(shell ls *.c)
SRC=$(wildcard *c)	//wildcard函数获取当前目录下的源文件
OBJ=$(SRC:.c=.o)	//.c文件全部替换为.o文件
CC=gcc				//编译器
Echo=echo
Rm=rm -f$(BIN):$(OBJ)	//.o文件链接形成可执行文件@$(CC) -o $@ $^
%.o:%.c@$(CC) -c $<.PHONY:clean
clean:@$(Rm) $(OBJ) $(BIN).PHONY:test
test:@$(Echo) "------"@$(Echo) $(SRC) @$(Echo) "------"@$(Echo) $(OBJ) @$(Echo) "------"

至此我们就完成了基本可以通用的Makefile文件。

4.6练习:进度条

4.6.1倒计时

回车和换行是两个不同的操作。

回车\r 换行\n

printf("hello world\r\n");
sleep(2);
//现象:先打印后休眠printf("hello world");
sleep(2);
//现象:先休眠后打印

在sleep期间,print函数已经执行完了,hello world此时被缓存到内存空间中了,没有打印到显示器,等到程序结束时,会自动刷新。刷新方式,以行为方式刷新,\r\n或者\n。

到此我们就可以实现一个简单的倒计时

#include<stdio.h>#define COUNT 15int main()
{int cnt = COUNT;while(cnt >= 0){printf("%-2d\r",cnt);fflush(stdout);  sleep(1);--cnt;}printf("\n");return 0;
}

4.6.2进度条version1

首先展示一下最后的效果图:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现的主要步骤与刚才练习的倒计时是相似的,主要是回车以及刷新缓冲区的操作。

cat progress.h

#pragma once
#include<stdio.h>
void progress_v1();

cat progress.c

#include"progress.h"
#include<string.h>
#include<unistd.h>#define NUM 101
#define STYLE '-'
const char *lable="|/-\\";void progress_v1()
{char buffer[NUM];memset(buffer,0,sizeof(buffer));int cnt = 0;while(cnt <= 100){int len = strlen(lable);printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);fflush(stdout);buffer[cnt] = STYLE;++cnt;usleep(500000);}
}

cat main.c

#include"progress.h"int main()
{progress_v1();return 0;
}

4.6.2进度条version2

cat progress.h

#include<stdio.h>
#include<string.h>
#include<unistd.h>void progress(double total, double current);

cat progress.c

#include"progress.h"#define NUM 101
#define STYLE '-'void progress(double total, double current)
{if(current > total)current = total;char buffer[NUM];memset(buffer,0,sizeof(buffer));const char *lable = "|/-\\";int len = strlen(lable);static int index = 0;double rate = current / total * 100;int num = (int)(rate);int i = 0;for(; i < num; i++){buffer[i] = STYLE;}printf("[%-100s][%.1lf%%][%c]\r", buffer, rate, lable[index++]);index %= len;fflush(stdout);if(current >= total){//printf("\n");printf("[%-100s][%.1lf%%][%c]\r", buffer, 100.0, lable[index++]);}
}

cat main.c

#include"progress.h"double total = 800.0;
double speed = 3.4;void DownLoad()
{double current = 0;while(current <= total){progress(total, current);usleep(3000);current += speed;}// 循环结束后,确保显示100%progress(total, total);printf("\ndownload %.2lfMB Done\n", current);
}int main()
{DownLoad();//progress(total, current);return 0;
}

4.7版本控制器Git

Git可以控制电脑上所有格式的文件,例如doc、excel、dwg、dgn、rvt等等。对于我们开发人员来说,Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件!

4.7.1git操作

1操作一次,以后不愁

安装:yum install -y git

查看版本:git --version

初始化本地仓库:git init

注意:千万不要在一个git仓库里面再执行 git init,这会创建嵌套的仓库,会导致各种问题。

配置本地仓库:name和email

git config user.name “用户名”

git config user.email “邮箱名”

免密码push:执行git config --global credential.helper store

之后进行一次push操作,输入用户名和密码即可

查看配置项:git config -l

删除配置项:git config --unset user.name

所有的git仓库设置git config --global user.name "用户名"

2经典"三件套"

添加指定文件:git add 文件名

添加所有文件到暂存区:git add .

提交本地:git commit -m "提交日志"

同步远端:git push

3常用

查看历史提交记录:git log

git log --pretty=oneline

查看git状态:git status

远端同步到本地:git pull

git pull的本质:提交自己的代码之前,必须把别人历史提交的代码同步到本地。

克隆现有的远程仓库到本地:git clone 远程仓库URL

查看远程仓库名:git remote

查看远程仓库详细信息:git remote -v

git diff 命令用于比较 Git 管理的代码在不同版本、不同区域之间的差异。它会以行-by-行的形式告诉你哪些内容被添加(+)、删减(-)或修改了。

4版本回退
工作区暂存区版本库指令
是否回退git reset --soft
是否回退git reset --mixed(默认选项)
是否回退git reset --hard(谨慎使用)

原因:hard选项会回退所有版本包括工作区未提交的代码,所以需要谨慎使用!!

将工作区回退到最近一次add的版本:git checkout -- 文件名

工作区暂存区版本库解决方式
xxx code1,手动撤销(麻烦易出错)2,git checkout – file_name
xxx codexxx code
xxx codexxx codexxx code

4.7.2小结

1,git进行版本控制时,通过同步记录"变化"信息来进行版本控制,可以减少空间的消耗。

2,git是一个去中心化的、分布式的版本控制器,但是使用时还是以中心化的模式为主。

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

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

相关文章

C++基本数据类型的范围

文章目录不同位数的系统下各个类型所占字节数如何存储的我发现我能搜到的相关文章都只讲了这些数据类型的范围是这样的&#xff0c;不说实际的存储情况&#xff0c;当你了解了类型实际是如何存储的&#xff0c;再去记忆这些范围就简单了&#xff0c;所以就有了这篇文章不同位数…

基于社交媒体数据的公众情绪指数构建与重大事件影响分析

一、引言在信息爆炸的时代&#xff0c;社交媒体&#xff08;如微博、Twitter&#xff09;已成为公众表达情绪、讨论热点事件的主要平台。通过分析社交媒体数据&#xff0c;可以构建公众情绪指数&#xff0c;并进一步研究其与股市波动、政策发布等重大事件的关联性。本文将介绍如…

OpenLayers数据源集成 -- 章节七:高德地图集成详解

前言在前面的文章中&#xff0c;我们学习了OpenLayers的瓦片调试&#xff08;VectorTileDebug&#xff09;技术。本文将深入探讨OpenLayers中高德地图的集成方法&#xff0c;这是WebGIS开发中接入商业地图服务的重要技术。高德地图作为国内领先的地图服务提供商&#xff0c;提供…

海外代理IP平台Top3评测:LoongProxy、神龙动态IP、IPIPGO哪家更适合你?

在当今互联网环境中&#xff0c;代理IP服务已成为许多企业和个人用户的刚需。无论是数据采集、市场调研还是账号管理&#xff0c;优质的代理IP都能大幅提升工作效率。本文将针对LoongProxy、神龙海外动态IP和IPIPGO这三家主流代理IP服务商进行横向评测&#xff0c;帮助你根据自…

对浏览器事件机制的理解

浏览器事件是什么&#xff1a; 事件是用户操作网页时发生的交互动作&#xff0c;比如 click/move&#xff0c; 事件除了用户触发的动作外&#xff0c;还可以是文档加载&#xff0c;窗口滚动和大小调整。事件被封装成一个 event 对象&#xff0c;包含了该事件发生时的所有相关信…

XCVP1902-2MSEVSVA6865 AMD 赛灵思 XilinxVersal Premium FPGA

XCVP1902-2MSEVSVA6865 是 AMD 赛灵思&#xff08;Xilinx&#xff09;Versal Premium FPGA 系列中的高端自适应系统级芯片&#xff08;Adaptive SoC&#xff09;变体&#xff0c;面向需要极高逻辑密度、海量 I/O 与超高速收发能力的数据中心互联、原型验证与高性能网络加速等应…

kotlin - 2个Fragment实现左右显示,左边列表,右边详情,平板横、竖屏切换(一)

kotlin - 2个Fragment实现左右显示&#xff0c;左边列表&#xff0c;右边详情&#xff0c;平板横、竖屏切换(要使用平板测试)平板横屏&#xff1a;左右fragment实现分屏效果&#xff0c;平板竖屏&#xff1a;只显示左边的fragment&#xff0c;点击才显示右边fragment屏幕旋转&a…

推荐系统中的AB测试:从设计到分析全流程

推荐系统中的AB测试:从设计到分析全流程 关键词:推荐系统、AB测试、实验设计、数据分析、效果评估、统计显著性、用户体验 摘要:本文将深入探讨推荐系统中AB测试的全流程,从实验设计到结果分析。我们将用通俗易懂的方式解释AB测试的核心概念,展示如何科学地评估推荐算法改…

【go语言 | 第1篇】Go环境安装+go语言特性

文章目录go开发环境1. 下载安装包2. 配置环境变量3. GOPROXYgo语言特性1. go的优势2. go适合做什么3. go缺点编写一个go程序注&#xff1a;在VSCode中补全go代码go开发环境 我这里是windows操作系统的环境安装&#xff0c;其他系统可以查看菜鸟教程&#xff1a;Go 语言环境安装…

【Pywinauto库】0. Pywinauto Windows GUI 自动化指南

概述 Pywinauto 是一个用于自动化 Windows GUI 应用程序的 Python 库&#xff0c;适用于自动化测试、数据录入和其他重复性桌面操作。 快速参考表方面方法/属性示例说明安装pip install pywinauto安装库后端选择Application(backend"uia") 或 Application(backend&qu…

CStringArray 和 CStringList

CStringArray 和 CStringList 都是 MFC 中用于管理字符串集合的类&#xff0c;但它们的内部数据结构和适用场景有显著差异&#xff0c;选择时需根据具体操作需求决定。以下从核心区别、功能对比和适用场景三个方面详细说明&#xff1a;一、核心区别&#xff1a;数据结构决定特性…

2025版基于springboot的企业考勤管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

设计模式(C++)详解—单例模式(1)

<摘要> 单例模式是创建型设计模式中最经典且应用最广泛的设计模式之一&#xff0c;它确保一个类只有一个实例并提供全局访问点。本文从历史背景和核心概念出发&#xff0c;详细阐述了单例模式的产生背景和演进历程&#xff0c;深入剖析了其在资源管理、状态一致性和访问控…

将GitHub远程仓库修改为ssh

8 将GitHub远程仓库修改为ssh 文章目录8 将GitHub远程仓库修改为ssh1 创建本地的ssh密钥2 设置GitHub密钥3 将本地库链接到远程仓库很多时候在使用GitHub的远程链接使用的是http的格式&#xff0c;但是这个格式并不好&#xff0c;尤其是在代码上传的时候&#xff0c;因此需要采…

【OEC-Turbo】网心云 OEC-Turbo 刷机 Armbian 系统教程

前言 大量网心云 OEC 及 OEC-Turbo 设备流入二手市场&#xff08;如海鲜市场&#xff09;&#xff0c;价格低至 70-100 元。相比同配置的拾光坞 N3&#xff08;约 380 元&#xff09;&#xff0c;OEC-Turbo 仅需一个零头&#xff0c;性价比极高。这些“矿渣”设备外观与玩客云…

25.线程概念和控制(二)

一、线程周边问题1.线程的优点创建一个新线程的代价要比创建一个新进程小得多。线程占用的资源要比进程少很多。能充分利用多处理器的可并行数量。在等待慢速I/O操作结束的同时&#xff0c;程序可执行其他的计算任务。计算密集型应用&#xff0c;为了能在多处理器系统上运行&am…

【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络

文章目录一、论文信息二、论文概要三、实验动机四、创新之处五、实验分析六、核心代码注释版本七、实验总结一、论文信息 论文题目&#xff1a;Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks中文题目&#xff1a;奔跑而非行走&#xff1a;追求更高FLOPS…

JVM(二)--- 类加载子系统

目录 前言 一、类加载过程 1. loading阶段 2. Linking阶段 2.1 验证 2.2 准备 2.3 解析 3. Initialization阶段 二、类加载器 1. 类加载器的分类 2. 用户自定义类加载器 三、双亲委派机制 四、其他知识点 前言 JVM的内存结构如图所示&#xff1a; 一、类加载过程…

Docker 容器的使用

1.容器的基本信息[roothost1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ac8245b5b08 img-layers-test "python /app/app.py" 45 hours ago Exited (0) 45 hour…

LLMs之Hallucinate:《Why Language Models Hallucinate》的翻译与解读

LLMs之Hallucinate&#xff1a;《Why Language Models Hallucinate》的翻译与解读 导读&#xff1a;该论文深入分析了语言模型中幻觉现象的成因&#xff0c;认为幻觉源于预训练阶段的统计压力和后训练阶段评估体系对猜测行为的奖励。论文提出了通过修改评估方法&#xff0c;使其…