【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 100
  3 
  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 1
  3 // #define VERSION2 2
  4                                                                                                                                                                     
  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 #else
 13     printf("hello free version\n");
 14 #endif
 15     //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写通

预备的两个小知识

缓冲区

回车与换行

入门版的进度条

升级版进度条 – 设计上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机-- 数电(3)

编码器与译码器 译码 &#xff1a;将二进制代码转化为其他进制的代码 编码 &#xff1a;就是将其他代码转换为二进制码 编码器的类型 1二进制编码器 用n位二进制数码对2的n次方个输入信号进行编码的电路 2二-十进制编码器 将0到9十个十进制数转化为二进制代码的电路 2…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比&#xff0c;非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止&#xff0c;我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

Python 解析CSV文件 使用Matplotlib绘图

数据存储在CSV文件中&#xff0c;使用Matplotlib实现数据可视化。 CSV文件&#xff1a;comma-separated values&#xff0c;是在文件中存储一系列以‘&#xff0c;’分隔的值。 例如&#xff1a;"0.0","2016-01-03","1","3","20…

性能测试-Jmeter中IF控制器使用

一、Jmeter控制器 分为两种类型&#xff1a; 控制测试计划执行过程中节点的逻辑执行顺序&#xff0c;如&#xff1a;循环控制器&#xff0c;if控制器等对测试计划中的脚本进行分组&#xff0c;方便Jmeter统计执行结果以及进行脚本的运行时控制等&#xff0c;如&#xff1a;吞…

【ann2coco】图像label转coco格式的JSON

目录 &#x1f34b;&#x1f34b;需求 &#x1f34b;&#x1f34b;coco格式 &#x1f34b;&#x1f34b;python代码实现 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01; 送你们一条美丽的--分割线-- &#x1f34b;&#x1f34b;需求 单波段灰度图l…

7-6 混合类型数据格式化输入

题目链接&#xff1a;7-6 混合类型数据格式化输入 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>int main(void) {int num;char c;float f1,f2;if (scanf("%f %d %c %f", &f1, &num, &c…

【NLP笔记】预训练+微调范式之OpenAI Transformer、ELMo、ULM-FiT、Bert..

文章目录 OpenAI TransformerELMoULM-FiTBert基础结构Embedding预训练&微调 【原文链接】&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 【本文参考链接】 The Illustrated BERT, ELMo, and co. (How NLP Cracked Tra…

单片机LED灯闪烁

延时函数计算&#xff08;相关代码生成&#xff09;&#xff1a; #include "reg52.h" #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i 22;j 3;k 227;do{do{while (--k);} while (--j);} while (--i); }vo…

以太网协议(数据链路层)

一些基础知识: 平时使用的网线,也叫做"以太网线".平时使用的交换机,也叫做"以太网交换机".以太网这个协议,既涉及到数据链路层的内容,也涉及到物理层的内容. 1. 以太网帧的格式 ①目的地址,源地址: 此处的地址,叫做mac地址(物理地址).作用也是区分不同…

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装

音乐是人类最美好的语言&#xff0c;它能够跨越国界、文化和语言&#xff0c;将人们紧密地联系在一起。在当今数字化时代&#xff0c;音乐创作已经不再是专业人士的专利&#xff0c;越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…

Linux:点命令source

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 source命令用于读取一个文件的内容并在当前Shell环境&#xff08;包括交互式Shell或是非交互式Shell&#xff09;执行里面的命令。它被称为点命令是因为命令名source也可…

【Web应用技术基础】HTML(4)——表单类的标签

目录 题目1&#xff1a;文本框 题目2&#xff1a;密码框 题目3&#xff1a;单选框 题目4&#xff1a;多选框 题目5&#xff1a;单选框选中 题目6&#xff1a;禁用disabled 题目7&#xff1a;lable标签 题目8&#xff1a;下拉框 题目9&#xff1a;textarea 题目10&…

【STM32】读写BKP备份寄存器RTC实时时钟

目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间 初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP BKP简介 BKP&#xff0…

05.自定义指令,插槽和路由配置

一、学习目标 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 一、自…

基于 HBase Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步

目录 一、总体架构 二、安装配置 MySQL 1. 创建 mysql 用户 2. 建立 MySQL 使用的目录 3. 解压安装包 4. 配置环境变量 5. 创建 MySQL 配置文件 6. MySQL 系统初始化 7. 启动 mysql 服务器 8. 创建 dba 用户 三、配置 MySQL 主从复制 四、安装部署 Kafka Connector…

【机器学习】k近邻(k-nearest neighbor )算法

文章目录 0. 前言1. 算法原理1.1 距离度量1.2 参数k的选择 2. 优缺点及适用场景3. 改进和扩展4. 案例5. 总结 0. 前言 k近邻&#xff08;k-nearest neighbors&#xff0c;KNN&#xff09;算法是一种基本的监督学习算法&#xff0c;用于分类和回归问题。k值的选择、距离度量及分…

(2024,YOSO,自协同学习,扩散 GAN,单步生成)您只需采样一次:通过自协同扩散 GAN 驯服一步文本到图像合成

You Only Sample Once: Taming One-Step Text-To-Image Synthesis by Self-Cooperative Diffusion GANs 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 背景…

Vue3 中应该使用 Ref 还是 Reactive?

一、引言 在Vue 3中&#xff0c;构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时&#xff0c;我们有两个主要工具&#xff1a;reactive和ref。选择使用哪一个&#xff0c;实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…

麒麟 V10 一键安装 Oracle 19C 19.22 单机版

Oracle 一键安装脚本&#xff0c;演示 麒麟 V10 一键安装 Oracle 19C 19.22 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚…

使用paho.mqtt.client实现MQTT Client连接EMQX Broker

目录 概述 1 认识paho.mqtt.client 2 实现MQTT Client 2.1 功能介绍 2.2 paho.mqtt.client库函数介绍 2.3 MQTT Client实现 2.3.1 创建项目 2.3.2 编写MQTT Client代码 2.3.3 Log工具源码 2.4 功能测试代码实现 2.4.1 功能介绍 2.4.2 代码实现 3 测试 3.1 EMQX上创…
最新文章