目录
- 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写通






















