【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写通

预备的两个小知识

缓冲区

回车与换行

入门版的进度条

升级版进度条 – 设计上

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

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

相关文章

linux命令(二)

环境变量 在这里我说一下linux的环境变量 windows的环境变量大家应该都用的很熟吧&#xff0c;在这里说一下linux怎么查看以及设置环境变量 首先是查看环境变量 export这就会列出来所有的环境变量 既然能看到环境变量&#xff0c;那如何进行设置呢 首先先试试echo $PATH看看…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

数据结构试卷第九套

1.时间复杂度 2.树&#xff0c;森林&#xff0c;二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线&#xff1b;去线&#xff0c;只保留当前根节点与第一个叶子节点的连线&#xff0c;删除它与其他节点之间的连线&#xff1b;然后根据左孩子右兄弟进行调整&#xf…

C++第六弹---类与对象(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、类的6个默认成员函数 2、构造函数 2.1、概念 2.2、特性 3、析构函数 3.1、概念 3.2、特性 3.3、调用顺序 总结 1、类的6个默认成员函数…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.1 基础知识

2.1.1 总账模块的基本功能 总账模块&#xff08;General Ledger&#xff0c;GL&#xff09;是“总分类账会计模块”的中文简称&#xff0c;它是财务会计&#xff08;FI&#xff09;模块的一个子模块&#xff0c;它是一切会计事务处理的核心模块。 它的基本功能有会计科…

【Linux】Linux工具学习之gcc/g++

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 接上文&#xff0c;我们已经学习了 Linux 中的编辑器 vim 的相关使用方法&#xff0c;现在…

WordPress Plugin NotificationX插件 SQL注入漏洞复现(CVE-2024-1698)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 0x02 漏洞概述 WordPress plugin NotificationX是一个应用插件。2.8.2版本及之前 存在安全漏洞,该…

【RAG实践】基于 LlamaIndex 和Qwen1.5搭建基于本地知识库的问答机器人

什么是RAG LLM会产生误导性的 “幻觉”&#xff0c;依赖的信息可能过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented G…

第八篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读使用Python库清洗处理从PDF文件提取的文本

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python清洗处理文本的常见步骤二、使用Python库去除非文本元素示例代码三、使用Python库去除格式化元素的示例代码四、使用Python库去除空白字符示例代码五、使用Python库合并段落和行示…

Oracle P6 Professional 配置连接数据库总结

前言 P6 Professional作为Oracle P6计划管理系统的重要套件之一&#xff0c;其操作出色&#xff0c;体检佳&#xff0c;是非常多的计划工程师跟踪项目进度计划的辅助工具。自20年前&#xff0c;Professional一直在不断的演变更新&#xff0c;以适应当前的新技术&#xff0c;从…

什么是可回收箱?可回收箱能回收哪些物品?具有哪些功能?

可回收箱是指专门用于收集居民或单位产生的、适宜回收和资源化利用的废弃物的容器。这些箱子通常会按照垃圾分类的标准进行设计&#xff0c;贴有明确标识&#xff0c;不同类型的可回收箱可能在开口大小、形状等方面有所不同&#xff0c;以适应不同类型可回收物的投放需求&#…

电源配小了,是不是容易烧?是的!

电源小的话会不会容易烧毁&#xff1f; 是的。 功率电压*电流。 随着功率增大&#xff0c;电压不变&#xff0c;电流增大&#xff0c;发热量增大&#xff0c;可能会烧毁。 今天给大家推荐一款650w的电脑电源&#xff0c;不过在推荐之前&#xff0c;首先要确认自己的电脑功耗…

制造业工厂为什么需要生产管理MES系统

一、制造业的生产管理需求与痛点 日趋激烈的市场竞争、客户对产品多样化要求越来越高&#xff0c;导致产品的生命周期缩短&#xff0c;企业需要通过智能制造实现降本、增效、提质&#xff0c;以提高企业的快速响应能力和核心竞争力。 二、生产管理的过程的痛点具体表现如下&am…

ES的集群节点发现故障排除指南(1)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容。 英文原文&#xff08;官网&#xff09; 集群节点发现是首要任务 集群互连&#xff0c;重中之重&#xff01; 在大多数情况下&#xff0c;发现和选举过程会迅速完成&#xff0c;并且主节点会长时间保持当选状…

Jmeter-基础元件使用(二)-属性及对数据库简单操作

一、Jmeter属性 当我们想要在不同线程组中使用某变量&#xff0c;就需要使用属&#xff0c;此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

Python数学建模-2.9Matplotlib库

Matplotlib库是Python中一个非常流行的绘图库&#xff0c;它提供了大量的绘图工具&#xff0c;可以生成各种类型的静态、动态、交互式的图表。Matplotlib的设计初衷是为了与NumPy配合使用&#xff0c;从而提供一个强大的数学绘图工具。 1.Matplotlib的主要特点 丰富的图表类型…

java 抽象

在进入抽象的学习之前&#xff0c;先看下面的代码&#xff0c;有一个Animal类&#xff0c;并且有一个eat方法&#xff0c;我们可以通过 Animal animal new Animal(); 来创建一个动物类对象。 public class Animal {public void eat(){System.out.println("动物吃东西&qu…

Github: Github actions自动化工作原理与多workflow创建和部署

Github actions 1 &#xff09;概述 Github Actions 是Github官方推出的 CI/CD 解决方案 https://docs.githu.com/en/actions 优点 自动发布流程可减少发布过程中手动操作成本&#xff0c;大幅提升ci/cd效率&#xff0c;快速实现项目发布上线 缺点 存在较高的技术门槛需要利用…

ARM_基础之RAS

Reliability, Availability, and Serviceability (RAS), for A-profile architecture 源自 https://developer.arm.com/documentation/102105/latest/ 1 Introduction to RAS 1.1 Faults,Errors,and failures 三个概念的区分&#xff1a; • A failure is the event of devia…

UE4 Json事件设置Asset值

通过Json事件来设置&#xff0c;比如骨骼网格体&#xff08;换皮&#xff09;等等