软件包管理器yum
如何进行软件安装?
因为
yum
只需要下载一次其他用户就可以使用,所以我们使用yum
的时候,就一般用root
身份
yum list | grep 关键字
:搜索包含指定关键字的软件
yum install 软件名:下载指定的软件
yum remove 软件名:卸载指定的软件
正如我们的软件管家,这个软件商店/管家,它怎么知道去哪里下载呢?
这些软件管家必须知道各个软件的下载地址!一般都是内置下载链接的地址(配置文件)
yum怎么知道我要下载的软件在哪里? yum 有自己的配置文件称为“yum源”
cd /etc/yum.repos.d/ :进入yum源。
这里就要说说如何更新yum源了?
- 先备份老的
yum
源CentOS-Base.repo
wget
获取新的yum
源配置文件,可以通过网络搜索得到mv
重命名成为CentOS-Base.repo
yum clean && yum makecache
,:清理曾经的缓存,并换成新的如果自己使用yum的时候没有问题,并且看到自己的yum源就是国内镜像源就不需要配置了
如果自己想安装的软件找不到,有可能就是再扩展的yum源当中:epel.repo
·sudo yum install -y epel -release, 根据你的base yum 源,帮我们找到和他匹配的扩展的yum源
VIM
编辑器
vim
是一款多模式的编辑器,只要有多种模式就有每种模式的用法和区别,每种模式的相互切换
vim
就是一个单纯的编辑器
yum install vim
:下载vim
vim
常见的几种模式:
- 命令模式
默认打开的模式就是命令模式 。大部分命令都是在命令行下执行
yy/nyy
复制当前行或者当前行在内的指定若干行p/np
粘贴一行或多行相同的内容到当前光标所在行之下
u
:撤销刚刚的操作ctrl + r
:对撤销进行撤销dd/ndd
:对当前行或者当前行在内的n
行进行剪切- 如果只进行
dd
不进行粘贴就是删除shift g
:将光标定位到文章结尾
gg
:将光标定位到文章开始n + shift + g
:将光标定位到指定行shift $
:将光标定位到文档行的结尾shift ^
:将光标定位到文档行的最开始nw nb
按照单词为单位,进行前后移动w
向后b
向前
shift ~
:快速大小写切换r/nr
:替换光标所在的字符或者连同n
个x/nx
:行内删除,从左到右n shift x
:行内删除, 从右到左h
左移动j
下移动k
:上移动l
:右移动
- 插入模式
- 底行模式
set nu
显示行号set nonu
:去掉行号%s///g
:替换/key
:搜索!command
vs 文件名
:分屏
- 在
vim
分屏模式下,光标在哪里我们就在编写哪一文件
ctrl ww
:切换光标到不同的界面
- 替换模式
- 视图模式
注意事项:
- 如果你不知道自己在那个模式下,可以无脑
esc
,就可以
- 退出的时候一般都是先保存再退出
- 在
vim
不要用鼠标滑轮
vim
配置
- 自己配置(不推荐)
vim
在启动的时候,会自动在当前用户的目录下,寻找配置文件。如果没有就是默认。一个用户,一个
vim
配置我们所做的配置不会影响其他人,配置所在目录是/home/vimtest
touch .vimrc-> vim .vimrc
- 自动化配置
可以直接执行这个命令,是
vim
更加智能化
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash./install.sh
然后再执行这句话就可以正常使用了
source ~/.bashrc
如果不用的话,可以执行
bash ~/.VimForCpp/uninstall.sh
进行删除
Linux
编译器-gcc/g++
使用
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
gcc
如何完成
gcc -o 编译完成的文件名 要编译的文件名
, 指定编译完成的文件名
预处理(进行宏替换)
- 预处理功能主要包括宏定义, 文件包含, 条件编译, 去注释等.
- 预处理指令是以
#
开头的代码行- 实例:
gcc -E hello.c -o hello.i
- 选项
-E
, 该选项的作用是让gcc
在预处理结束后停止编译过程
- 选项
-o
是指目标文件,i
文件为已经过预处理的C原始程序
编译(生成汇编)
- 在这个阶段中,
gcc
首先要检查代码的规范性, 是否有语法错误, 以确定代码的实际要做的工作, 在检查无误后,gcc
把代码翻译成汇编语言
- 用户可以使用
-S
选项进行查看, 该选项只进行编译不进行汇编, 生成汇编代码- 实例:
gcc -S hello.i -o hello.s
汇编(生成机器课识别代码)
- 汇编阶段就是把编译器生成的
.s
文件转成目标文件
gcc -c hello.s -o hello.o
, 将汇编代码转换成, 二进制目标代码了
链接
- 在成功编译之后, 就进入链接阶段
- 实例:
gcc hello.o -o hello
在这里涉及到一个重要的概念: 函数库
- 我们在
C
程序中, 并没有定义printf
的函数实现, 且在预编译中包含的stdio.h
中也只有函数的声明, 而没有定义函数的实现,那么是在哪里实现printf
函数的呢?- 最后的答案是: 系统把这些函数实现定义到
libc.so.6
的库文件当中了, 在没有特别指定的时候,gcc
会到系统默认的搜索路径usr/lib
下进行查找, 也就是链接到libc.so.6
库函数当中, 这样就能实现函数printf
, 而这也是链接的作用
函数库一般分为静态库和动态库两种
- 静态库是指编译链接时, 把库文件的代码全部加入到可执行文件当中, 因此生成的文件比较大, 但在运行时就不需要库文件了. 其后缀一般是
.a
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀为
.so
, 如前面所述的libc.so.6
就是动态库。gcc
在编译的时候默认使用动态库。完成了链接之后,gcc
就可以生成可执行文件如下所示gcc hello.o -o hello
gcc
默认生成二进制文件, 是动态链接的,这样可以通过file
命令验证
gcc
选项
-E
只激活预处理, 这个不生成文件, 你需要把他重定向到一个输出文件里面-S
编译到汇编语言不进行汇编和链接
-c
编译到目标代码static
对生成的文件采用静态链接-g
生成调试信息,GNU
调试器可利用该信息
-shared
此选项将尽量使用动态库,所以生成的文件比较小,但是需要系统有动态库-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0
没有没有任何优化,-O1
为缺省值,-O3
优化级别最高
-w
不生成任何警告信息-Wall
生成所有警告信息
gcc
选项记忆
esc iso
Linux
项目自动化构建工具-make/Makefile
背景
- 会不会写
Makefile
,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录当中,
makefile
定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,甚至进行更复杂的功能操作
makefile
带来的一个好处就是—“自动化编译”, 一旦写好,只需要一个make
命令,整个工程完全自动编译,极大的提高了软件开发的效率make
是一个命令工具,是一个解释makefile
中指令的命令工具,一般来说,大多数的IDE
都有这个命令
make
是一个指令,makefile
是一个文件,两个搭配使用,完成项目自动化构建
理解
makefile
是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具,完成一件事情必须要有正确的依赖关系和依赖方法
.PHONY
:总是被执行的如何得知是否需要重新进行执行呢?
通过对比时间来进行
实例
依赖关系:
- 上面的代码
file
依赖file.o
file.o
依赖file.s
file.s
依赖file.i
file.i
依赖file.c
原理
make
是如何工作的,在默认方式下,也就是我们只输入make
命令那么:
make
会在当前目录下找名字Makefile
或makefile
的文件
- 如果找到,它会找文件中的第一个目标文件,在上面的实例中,它会找
file
这个文件,并把这个文件作为最终的目标文件- 如果
file
文件不存在,或是file
所依赖的后面的file.o
文件的修改时间要比file
这个文件新,那么会执行后面定义的命令来生成file
这个文件
- 如果
file
所依赖的file.o
不存在,那么make
会在当前文件中找目标文件file.o
所依赖的如果找到再根据那一个规则生成hello.o
文件(这一点像堆栈的过程)
- 这就是整个
make
的依赖性,make
会一层又一层的去找文件的依赖关系,知道最终编译出一个目标文件
- 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么
make
就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make
根本不理
make
只管文件的依赖性,即,如果在找了依赖关系之后冒号后面的文件还是不存在,那就不工作了
项目清理
- 工程是需要清理的
- 像
clean
这种,没有被第一个目标文件直接或者间接的关联,那么后面定义的命令不会被自动执行,不过我们可以显示要make
执行。即命令make clean
来清楚所有的目标文件,以便重新编译
- 但是一般我们这种
clean
目标文件,我们将它设置为伪目标,用.PHONY
修饰,伪目标的特性是,总是被执行的
Linux
第一个小程序 - 进度条
\r&&\n
理解回车和换行,回车是光标回到文档开头,换行是从上一行文档最后向下移动,然后回到文档开头
行缓冲区
什么现象?
首先打印出里面的内容,然后停顿3秒出现命令行
#include <stdio.h> int main() { printf("hello Makefile!\n"); sleep(3); return 0; }
什么现象?
#include <stdio.h> int main() { printf("hello Makefile!"); fflush(stdout);// 刷新出缓冲区的内容 sleep(3); return 0; }
进度条代码
使用git
命令行
安装git
yum install git
git --version
:查看安装git
的版本
提交步骤:
git add .
,将需要用git
管理的文件告知git
git commit -m "信息"
, 提交改动到本地git push
, 同步到远端服务器上
Linux
调试器 - gdb
使用
背景
- 程序的发布方式有两种,
debug
和release
模式Linux gcc/g++
出来的二进制程序,默认是release
模式
- 要使用
gdb
,必须在源代码生成二进制的时候,加上-g
选项
开始使用
如果直接使用gcc -o file file.c -std=c99
显示是如下现象
这是因为默认是release
版本,不可以调试如果想要调试就要加上-g
选项。
readelf -S 可执行程序名
readelf -S 可执行程序名 | grep -i debug
:显示调试信息
l(list) 1
:gdb
模式下显示要调试的代码
r(run)
:gdb
模式下启动程序并运行
b(breakpoint)行号
:在指定行打断点
info b
:查看断点
d 断点的编号
:删除断点
disable breakpoint 断点编号
, :设置指定断点为空断点
enable breakpoint 断点编号
:开启断点
n(next)
:逐过程
s(step)
:逐语句
bt
:查看调用栈
p 变量名
:显示变量
display 变量名
:显示要查看的变量
undisplay
:取消对应的变量
until 行号
:直接让代码跑到我们指定的行号
调试器的核心工作,主要是为了定位问题
所有显示指令不影响调试指令
finish
:进入一个函数,只执行完函数,就停下来
c
:从一个断点处运行至下一个断点处
set var n = xxx
:设置某一个变量是特定值