【Linux第三课-基础开发工具的使用】yum、vim、gcc/g++编译器、gdb、Make/Makefile编写、进度条程序、git命令行简单操作
目录
- yum - 软件包管理器
- 快速认识yum
- 快速使用yum
- yum搜索
- yum安装
- yum卸载
- yum的周边 - yum的整个生态问题
- vim
- 快速介绍vim
- vim的模式
- 命令模式
- 插入模式
- 低行模式
- 常见模式 -- 命令、低行
- 命令模式 -- 光标的移动
- 命令模式 -- 复制粘贴、剪贴、删除
- 命令模式 -- 小写/大写
- 替换模式
- 命令模式 -- 删除
- 命令模式 -- 查找
- 低行模式
- 多窗口的光标移动
- 批量化注释/去注释
- 配置问题
- 解决sudo的白名单
- gcc/g++
- 程序的翻译过程及gcc选项
- 预处理
- 条件编译
- 编译
- 汇编
- 链接
- g++
- 动静态库的理解 -- 链接
- 动态链接、动态库
- 静态链接、静态库
- make/makefile -- 项目自动化构建
- 快速使用
- 解释依赖关系和依赖方法
- 清理项目
- make的小知识点
- 认识的文件的时间
- 补充makefile的语法
- &@ 、 &^
- makefile里面的全局变量
- 关于makefile/make的语法推导
- 第一个小程序 -- 进度条
- 预备的两个小知识
- 缓冲区
- 回车与换行
- 入门版的进度条
- 升级版进度条 -- 设计上
yum - 软件包管理器
快速认识yum
Linux中我们也要进行工具/指令/程序,安装、检查、卸载等,需要yum的软件
安装软件的方式:
1、源代码安装 – 交叉编译的工作
2、rpm包直接安装
3、yum / apt-get
yum是我们Linux上的一条指令,搜索、下载、安装对应的软件
yum相当于是Linux的应用商店!
快速使用yum
yum list //列举yum可以安装的东西
yum搜索
yum list | grep lrzsz
yum安装
yum是先下载再安装
yum install 文件名
yum -y install 文件名
yum卸载
yum remove 文件名
-y:对于一些询问表示yes
yum -y remove 文件名
yum的周边 - yum的整个生态问题

1、yum如何得知目标服务器的地址和下载链接?
配置文件里面会记录下载的地址
ls /etc/yum.repos.d/
这里面对应的都是yum的本地仓库名

其中CentOS-Base.repo就是yum源,可以更改yum源

扩展软件源
yum install -y epel-release
2、云服务器谁提供的?
既得利益者提供的
3、谁提供软件?
大家愿意写的人开发的
vim
写代码:vim
编代码:gcc/g++
调代码:gdb
维护项目结构、自动化编译:make/makefile
快速介绍vim
vim是一款多模式的编辑器,vim里面还有很多的子命令,来进行代码的编写操作
1、进入vim后一般没法写入,需要模式切换,i – insert插入模式

2、写完后按esc退出插入模式 -> shift+;(也就是:)进入低行模式 -> wq(保存并退出)-> 回车

3、gcc编译,运行

vim的模式

命令模式
插入模式 -> 命令模式:esc
插入模式
命令模式 -> 插入模式 :i/a/o
低行模式
命令模式 -> 低行模式:shift + ;(也就是:)
低行模式 -> 命令模式:esc
常见模式 – 命令、低行
命令模式 – 光标的移动
将光标定位到最右侧结尾处:shift+4($)
将光标定位到最左侧开头处:shift+6(^)
将光标定位到文本的最后一行:shift+g(G)
将光标定位到文本的最开始一行:gg
将光标定位到特定一行,例如第五行:5 shift g
h:左
j:下
k:上
l:右
w:以单词为单位向后移动
b:以单词为单位向前移动
命令模式 – 复制粘贴、剪贴、删除
n+yy:复制所在行/多行
n+p:在下一行进行粘贴一次/n次
u:撤销编辑操作,undo
ctrl+r:对刚刚的撤销进行撤销
n+dd:删除/剪切当前行/多行
dd、p:剪切
命令模式 – 小写/大写
shift+`(~):大小写快速切换
替换模式
n+r:替换当前光标所在字符/n个字符
shift+r:替换模式

命令模式 – 删除
n+x:删除光标所在字符/后面n个字符(往后删)
n+shift+x:往前删
命令模式 – 查找
shift+3(#):高亮要查找的函数名
n:下一个查找到的函数名/字符串
低行模式
wq:报存并退出
w!:强制写
q!:强制退出
wq!:强制保存并退出
!指令:可以在低行模式执行shell指令
/搜索的内容:
?搜索的内容
vs 文件名:会形成一个并在旁边对比
set nu:调出行号
set nonu:取消行号
vim test.c 行号:光标直接定位到指定行
shift+zz:保存并退出vim(不建议用)

光标在哪个窗口就是在编辑哪个窗口


多窗口的光标移动
ctrl+ww
批量化注释/去注释
批量化注释
1、ctrl+v:进入VISUAL BLOCK模式
2、按hjkl进行区域选择
3、shift+i:从VISUAL BLOCK模式切换成插入模式
4、//
5、按esc

批量化去注释
1、ctrl+v:进入VISUAL BLOCK模式
2、hjkl选择区域
3、按d

配置问题
1、进入用户家目录下

2、创建.vimrc

3、vim .vimrc进行配置
set nu //显示行号
set cursorline //突出显示当前行
hi Cursorline cterm=bold ctermbg=black ctermfg=green guibg=green //粗体显示选中行,用黑色框,字体标绿
set cursorcolum //设置列高亮
set autoindent //自动缩进
set softtabstop=4 //统一缩进为4
set tabstop=4 //tab缩进为4
set cindent
set shiftwidth=4
set smartindent //提供自动缩进
syntax on //语法高亮 inoremap ' ''<ESC>i //自动补齐
inoremap " ""<ESC>i
inoremap < <><ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {<CR>}<ESC>O
简便配置方法:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
一定在普通账号下运行
解决sudo的白名单


得有root账户改
vim /etc/sudoers


gcc/g++
程序的翻译过程及gcc选项
编译C语言是默认是a.out,如果想要指定名称的话,下列两种方法。
默认形成

指定名称


凡是和 -o 紧邻的是形成的可执行程序
1 #include <stdio.h>2 #define M 1003 4 int main()5 {6 printf("hello linux\n");7 printf("hello linux: %d\n", M); 8 //printf("hello linux\n");9 //printf("hello linux\n");10 //printf("hello linux\n");11 //printf("hello linux\n");12 //printf("hello linux\n");13 14 return 0;15 }
预处理
头文件展开:本质在预处理的时候,将头文件内容拷贝至源文件
去注释
宏替换
条件编译
gcc -E test.c -o test.i
-E : 从现在开始进行程序的翻译过程,预处理做完的时候就停下来

上面多出的八百多行代码都是头文件展开
条件编译
条件编译的本质:对代码进行裁剪
1 #include <stdio.h>2 #define VERSION1 13 // #define VERSION2 24 5 int main()6 {7 printf("hello linux\n");8 #ifdef VERSION1 9 printf("hello version1.0\n");10 #elif VERSION2 11 printf("hello version2.0\n");12 #else13 printf("hello free version\n");14 #endif15 //printf("hello linux\n");16 //printf("hello linux\n");17 //printf("hello linux\n");18 //printf("hello linux\n");19 //printf("hello linux\n");20 21 return 0;22 }

将test.c里面的两个宏都注释掉,可以在gcc指令里面添加宏 -D
gcc test.c -o test.exe -D VERSION1=1
gcc test.c -o test.exe -DVERSION1=1
//可以连着也可也不连着

应用场景
1、对于软件的专业版与社区版,维护一份代码,可以用条件编译对里面的功能进行裁剪
2、头文件定义上,防止头文件被重复包含
#ifndef __CODE_H__
#define __CODE_H__
// XXXX
#endif
编译
C -> 汇编
从test.c开始也许, -S 从现在开始进行语言的翻译,当编译工作完成就停止
gcc -S test.i -o test.s
形成汇编语言

汇编
汇编 -> 二进制,可重定位目标二进制文件(不能执行)
test.o : 可重定位目标二进制文件
gcc -c test.s -o test.o
vim是文本编辑器,所有对于二进制展现出来是乱码

链接
将可执行程序与库关联起来
gcc -o test test.o
ldd 命令可以查询一个可执行文件所依赖的库

其中/lib64/libc.so.6就是所用的C语言的库
g++
1、编译失败问题

输入下列指令
sudo yum -y install gcc+ gcc-c++
2、编译形成指定名称的可执行程序
C语言也可以用g++编译,g++的选项与gcc一样

g++ test.c -o mybincpp
g++ -o mybincpp test.c
动静态库的理解 – 链接
我们所写的代码都是代码+调用的库
库让我们写一份代码不用从零开始
都是文件

下面这个是个动态库

去掉lib(所有库都以这个开头),去掉.so.6,所有这个库是个c库
动态库 -> 动态链接
静态库 -> 静态链接
动态库
优点:节省资源,不会出现太多的重复代码 — 资源(磁盘、内存、网络(如果你在一个网站上传一份重复很多的代码,那别人下载也是在浪费资源)等)
缺点:对库的依赖性比较强,一旦库丢失,所以使用这个库的程序都无法运行
静态库
优点:不依赖库,同类型平台中都可以直接运行使用
缺点:可执行程序体积比较大,比较浪费资源 — 资源(磁盘、内存、网络(如果你在一个网站上传一份重复很多的代码,那别人下载也是在浪费资源)等)
动态链接、动态库
被多个使用者共享使用,一旦缺失,所有程序都不可以运行了!!
我们调用哪个库,只是在代码中指明库的地址

静态链接、静态库
代码中我们用到哪个库,直接硬拷过来,成为静态链接

ldd
ldd可以查看一个文件库的依赖情况

file
动态库又称为共享库

形成用静态库的可执行程序
注意:一般程序是不会给安装静态库de,需要用yum进行安装
ld是连接器
sudo yum install -y glibc-static libstdc++-static
make/makefile – 项目自动化构建
在linux中是使用命令行的,如果有十几个源文件,难道每一个都要用gcc/g++去进行预处理、编译、汇编等操作吗?
make是一个命令
makefile是一个文件(保存的依赖关系和依赖方法)
快速使用
1、创建Makefile/makefile文件
touch Makefile
touch makefile

2、vim打开这个文件
第一行:依赖关系
第二行:依赖方法


解释依赖关系和依赖方法
依赖关系:我为什么要帮你?
依赖方法:我怎么帮你?

清理项目
clean后面为空,需要依赖关系,但依赖关系为空

make的小知识点
1、Makefile和make形成目标文件的时候,默认是从上到下扫描makefle的文件,默认形成的第一个目标文件
2、默认只形成一个
3、 make和makefile怎么知道可执行程序是比较新的呢??这个是通过对比时间比出来的,只要可执行程序的最近修改时间比所有源文件的最近修改时间新,说明它就是最新的!




认识的文件的时间
1、Modify:对文件内容做修改时
2、Change:对文件属性做修改时
3、Accesss:文件访问时间,只有对文件内容进行打印查看的时候才会改变
1、当对文件内容进行修改的时候,文件的大小也会改变,连带着文件的属性也变了

2、对权限进行修改的时候不会改变内容,因此只有Change改变了

3、

Access并不是每一次都会改变:最初设计的时候,每次查看Access都会改变更新。相比于修改内容和属性,查看文件是十分频繁的,这导致Access会频繁更新,进而造成资源浪费。-- 当短时间内频繁查看时,Access只会在第一次时修改,之后不再修改
4、当不想更改文件内容,而想让Modify更新
可以用touch,当创建的文件存在时,它只会刷新文件的时间。
5、不用touch就make
如果每一次make都要touch一下太麻烦了 — PHONY
修饰mybin目标文件,成为一个伪目标


但我们一般是给clean
.PHONY:clean
补充makefile的语法
&@ 、 &^
&@代表mybin
$^代表mytest.c

makefile里面的全局变量

关于makefile/make的语法推导

第一个小程序 – 进度条
写源代码之前,先把makefile写通
预备的两个小知识
缓冲区
回车与换行
入门版的进度条
升级版进度条 – 设计上
相关文章:
【Linux第三课-基础开发工具的使用】yum、vim、gcc/g++编译器、gdb、Make/Makefile编写、进度条程序、git命令行简单操作
目录 yum - 软件包管理器快速认识yum快速使用yumyum搜索yum安装yum卸载 yum的周边 - yum的整个生态问题 vim快速介绍vimvim的模式命令模式插入模式低行模式 常见模式 -- 命令、低行命令模式 -- 光标的移动命令模式 -- 复制粘贴、剪贴、删除命令模式 -- 小写/大写替换模式命令模…...
Redis:ClassCastException【bug】
Redis:ClassCastException【bug】 前言版权Redis:ClassCastException【bug】错误产生相关资源控制器:UserController("/user")配置:RedisConfiguration实体类:User数据表:User 解决 最后 前言 2…...
JSON 配置文件
JSON 配置文件的作用 JSON 是一种数据格式,在实际开发中, JSON 总是以配置文件的形式出现。小程序项目中也不例外:通过不同的 .json 配置文件,可以对小程序项目进行不同级别的配置。 小程序项目中有 4 种 json 配置文件࿰…...
由浅到深认识Java语言(6):控制流程语句
该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…...
lv17 安防监控项目实战 3
代码目录 框架 our_storage 编译最终生成的目标文件obj 编译生成中间的.o文件 data_global.c 公共资源定义(使用在外extern即可)定义了锁定义了条件变量消息队列id、共享内存id、信号量id及key值发送短信、接收短信的号码向消息队列发送消息的函数&am…...
文本处理基本方法
目录 分词 jieba 词性标注 😆😆😆感谢大家观看😆😆😆 分词 在中文文本中,由于词与词之间没有明显的界限符,如英文中的空格,因此分词是中文自然语言处理的一个基础且…...
Java面试题(Spring篇)
💟💟前言 友友们大家好,我是你们的小王同学😗😗 今天给大家打来的是 Java面试题(Spring篇) 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞👍 收藏⭐ 评论📄 小王的主页…...
操作系统:malloc与堆区内存管理
malloc是函数而不是系统调用,他的底层是同调调用brk和mmap这两个系统调用实现功能的,具体选择brk还是mmap要看申请的空间大小以及malloc中的阈值(一般是128kb) 注意申请的空间只有使用才会触发缺页中断映射到物理内存 不理解的话先…...
javaSwing推箱子游戏
一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力,使人们暂时忘却生活当中的烦恼,增强人们的逻辑思维能力,游戏的艺术美也吸引着越来越多的玩家和厂商,寓教于乐,在放松人们心情的同时还可以活跃双手。在人类…...
JAVA多线程之JMM
文章目录 1. Java内存模型2. 内存交互3. 三大特性3.1 可见性3.1.1 可见性问题3.1.2 原因3.1.3 解决方法 3.2 原子性3.3 有序性 4. 指令重排5. JMM 与 happens-before5.1 happens-before关系定义5.2 happens-before 关系 在继续学习JUC之前,我们现在这里介绍一下Java…...
Windows10 专业版 系统激活
Windows10 专业版 系统激活 参考: Windows10系统激活技巧 第一步:在电脑桌面,新建一个文本文档 第二步:打开文本文档,输入以下代码后,直接保存关闭文档 slmgr/skms kms.03k.org slmgr/ato 第三步࿱…...
C#使用LINQ和EF Core
在实际应用中,您可以使用 LINQ 查询 EF Core 来执行各种数据库操作。通过 LINQ,您可以轻松地过滤、排序、分组和连接数据。 要使用LINQ查询EF Core中的数据,您可以按照以下步骤进行操作: 首先,确保您已经安装了 Entit…...
数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署
简介 随着数字人物概念的兴起和生成技术的不断发展,将照片中的人物与音频输入进行同步变得越来越容易。然而,目前仍存在一些问题,比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题,来自西安…...
HTML5语法总结
文章目录 一.HTML基本框架二.标题标签三.段落标签四.换行与水平线标签五.文本格式化标签(加粗、倾斜、下划线、删除线)六.图像标签扩展:相对路径,绝对路径与在线网址 七.超链接标签八.音频标签九.视频标签十.列表标签十一.表格标签扩展:表格结构标签合并…...
在github下载的神经网络项目,如何运行?
github网页上可获取的信息 在github上面,有一个requirements.txt文件,该文件说明了项目要求的python解释器的模块。 - 此外,还有一个README.md文件,用来说明项目的运行环境以及其他的信息。例如python解释器的版本是3.7、PyTorc…...
spring boot学习第十四篇:使用AOP编程
一、基本介绍 1,什么是 AOP (1)AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 (2)利用 AOP…...
凯特信安云签解决方案
联合解决方案 凯特信安基于《电子签名法》设计“云签服务方案”,应用人脸识别、电子签章签名云服务等技术,支持多个自然人、多个企业等签名,满足各种移动终端签署的应用场景。面向不动产登记、工改系统等社会公众服务系统,针对自然…...
【xr806开发板使用】连接wifi例程实现
##开发环境 win10 WSL ##1、环境配置 参考:https://aijishu.com/a/1060000000287513 首先下载安装wsl 和ubuntu https://docs.microsoft.com/zh-cn/windows/wsl/install (1)安装repo: 创建repo安装目录: mkdir ~/…...
停车管理系统asp.net+sqlserver
停车管理系统asp.netsqlserver 说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库, 功能模块: 停车管理系统asp.net sqlserver 用户功能有菜单列表 我的停车记录 专…...
新增多项功能,龙讯旷腾开源机器学习力场PWMLFF 2024.3版本上线
人工智能与传统计算机模拟结合是当今科学计算的一大趋势,机器学习力场作为其中的一个重要方向,能够显著提升分子动力学模拟的精度和效率。PWMLFF是一套由龙讯旷腾团队开发,在 GNU 许可下的开源软件包,用于快速生成媲美从头算分子动力学(AIMD&…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...



