目录
Linux软件包管理器 yum
rzsz
Linux编辑器——vim
vim的使用
vim的基本操作
命令模式的常见命令
底行模式的常见命令
vim是需要配置的
Linux编译器——gcc/g++
预处理
编译
汇编
链接
函数库
Linux项目自动化构建工具 make/makefile
make原理
项目清理
Linux调试器gdb
Linux软件包管理器 yum
简单的把它理解为“应用商店”就可以,我们可以来安装第一个软件。
rzsz
这个工具用于windows机器和远端的linux机器通过xshell传输文件,可以通过拖拽的方式将文件传上去。
通过yum list命令可以看到所有的软件包。
yum list | grep lrzsz
使用下面这个指令就可以下载它了。
sudo yum install lrzsz -y
想要卸载的话,使用这个就可以了。
sudo yum remove lrzsz
Linux编辑器——vim
我们在网上随便一找就可以找到这张键盘图,这就是大部分的vim的使用方法,但也没有必要全记住,用哪个记哪个就可以了。
vim它是一个编辑器,换言之它只能写代码,和我们平常用的编译器还是有差别的,我用的vs编译器它是一个集成的开发环境,它既可以编写代码、调试代码,也可以运行程序等,但是vim它只能写代码,就像记事本一样。
那它只能写代码,我们为什么还要用它呢?在linux下的编辑器还是很多的,但是对于初学的时候,vim还是能在众多编辑器中脱颖而出的,它是许多系统默认装机数最高的,虽然学习成本有一点高,但是不要灰心,并没有那么难学,在linux下我们还是要编写代码的,所以vim是比较优的选择。
vim的使用
首先要进入vim
#vim //会出现一些版本信息等 #vim [文件名] //如果这个文件没有就创建并进入vim
想要退出vim,首先按下键盘的Esc,输入(:q)(这是一个整体)就可以退出。
这个只是测试vim能不能使用。
vim的基本操作
vim是一款多模式的编辑器,它有命令模式、编辑(插入)模式和底行模式。
首先输入vim [文件名]命令进入vim,这是一个全屏幕编辑画面,进入vim默认的就是命令模式,我们需要进入到插入模式才可以编写代码。
开始进入默认的命令模式的左下角就是这样的,或者什么都没有。
[命令模式]切换至[插入模式]输入a输入i输入o输入过后左下角就会变成这样,这就进入到了插入模式。[插入模式]切换至[命令模式]直接按下键盘左上角的Esc输入后屏幕左下角就变成了空白。那我们想要退出vim,就可以进入到底行模式[命令模式]切换至[底行模式]输入:也就是冒号再输入命令:w (保存当前文件)
:q (退出)
:wp (保存并退出)
:! (加上 ! 就代表强制,出现问题的时候可以加上!)
由图可知,插入模式和底行模式不能切换。
命令模式的常见命令
yy:将当前光标所在行进行复制,nyy可以复制多行
p :将复制的内容进行粘贴,np可以粘贴多次
dd:将当前光标所在的行,进行剪切(删除),也可以使用ndd
u :撤销
ctrl + r:撤销u的操作
shift + g(G):将光标定位到文件的结尾
gg:将光标定位到文件的最开始
n + shift + g:将光标定位到文件的第n行
shift + 6(^) :将光标定位到当前行的最开始
shift + 4($) :将光标定位到当前行的结尾
w、b:以单词为单位进行光标的向后、向前移动,也可以nw、nb使用
h、j、k、l:向左、向下、向上、向右移动光标
shift + ~:大小写的切换
shift + r :进入替换模式,可以替换光标指向的内容
r :替换光标所在的字符,同样可以使用nr
x or shift + x(X):删除光标所在的字符,之后or之前,也支持nx
底行模式的常见命令
:set nu:显示行号
:set nonu:取消显示行号
:vs (文件名):分屏操作
ctrl + ww:分屏下切换操作的文件
:! + 指令:在vim的底行模式下执行linux下的指令
vim是需要配置的
如果你现在正在使用原生的vim来写代码,那么第一个感觉应该就是很麻烦,那是因为vim是需要配置的,我们需要配置一个好用的环境来写代码。
首先我们要在当前的用户目录下要有一个.vimrc的文件,我们需要在这个文件中添加vim的配置项,那有哪些配置项呢,那可以百度一下,想要什么样的效果就添加什么效果的配置项到文件.vimrc中;如果嫌麻烦,也可以找一些插件,这里我就不过多介绍了。
Linux编译器——gcc/g++
前面的vim满足我们写代码的要求,gcc和g++就可以帮我们编译代码,gcc这个软件可以说是大部分操作系统自动默认安装的,g++可能没有,不要担心,就算是gcc没有我们也可以下载。
在这之前,我们也可以先来讨论一下程序的翻译过程,编译器做的工作不就是把我们认识的语言转化成计算机认识的语言吗。下面我们就来介绍我们写的代码是怎么一步步的翻译成了计算机认识的语言也就是二进制的指令。
预处理
在这一部分要处理的就是:
1.去注释 2.宏替换 3.头文件展开 4.条件编译
下面我们介绍一下简单的选项:
-E:让gcc在预处理结束后停止翻译过程
-o:让.c文件编译成指定名字的文件
因为在Linux下直接gcc -E .c文件,他会把内容直接打印出来,所以我们用gcc -E .c文件 -o 指定的文件。
//我的.c文件就是mytest.c,里面有简单的代码 # gcc -E mytest.c -o mytest.i//指定的文件就是指定文件名
然后就可以看到目录下有一个mytest.i的文件,我们用vim打开,G选项直接到最底可以看到原来的代码变成了800多行的,这就是把头文件全展开了,进行了宏替换,注释都没有了,条件编译执行了,所以这就是预处理的操作。
最后在说一下,我们写代码的时候,在头文件中的开头都会写上#pragma once,这句代码就是让我们的头文件不要重复编译,以免代码过长。
编译
编译就是把C语言转换为汇编语言。
# gcc -S mytest.i -o mytest.s
选项-S:让gcc在编译结束后停止翻译过程,生成汇编语言
这里用.i或者.c都可以都是到编译就停止
汇编
把汇编语言变成可重定位目标二进制文件
# gcc -c mytest.s -o mytest.o
这个.o文件和我们Windows下的obj文件是一样的
选项-c:让gcc在汇编结束后停止翻译过程,生成可重定位目标二进制文件
链接
# gcc mytest.o -o mytest
执行这个命令就可以生成可执行程序
函数库
在链接的过程还可以再说一点其他的,一般的链接过程有两种方式,动态链接和静态链接。
动态链接需要动态库,静态链接需要静态库。这也是我们一直默默在用的,只是我们自己可能不知道。
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
- 动态库不是这样的,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。
动态链接:
优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
缺点:依赖动态库,程序可移植性较差。
静态链接:
优点:不依赖第三方库,程序的可移植性较高。
缺点:浪费空间。gcc和g++生成的文件默认就是动态链接,使用file指令就可以查看。
使用ldd指令可以查看动态链接的可执行文件所依赖的库。
这个/lib64/libc.so.6就是c标准库,linux下的很多指令也是用c语言写的,使用ldd /user/bin/ls也可以看到这条依赖关系。
可执行文件就是把函数和库中的实现链接起来,你写的C语言的printf函数,它到最后也是要和库中链接起来的。gcc和g++默认采用的是动态链接,但如果我们需要使用静态链接,带上-static选项即可。有的云服务器可能没有一些静态库,这时候就需要你自己去下载了。
由此可见,动态和静态链接的内存还是差别很大的。
Linux项目自动化构建工具 make/makefile
简单来说,make是一个命令,makefile是一个文件,以后的工程的源文件会有很多个,文件的编译顺序也是有要求的,而make和makefile写好就可以帮助我们自动化构建项目。
想要编写makefile就要知道两点:依赖关系和依赖方法。
依赖关系:文件1改变会影响文件2,这就是文件2依赖于文件1。
- 比如,.o文件是由.c文件通过预处理、编译、汇编之后生成的文件,.c文件就会影响.o文件,所以.o文件依赖于.c文件。
依赖方法:文件2依赖于文件1,那么由文件1生成文件2的方法就是依赖方法。
- .o文件依赖于.c文件,那么gcc -c -o test.c test.o这条命令就是.o依赖于.c的依赖方法。
那么下面就来用一下make和makefile。
在目录下随便写了一段代码,下面这张就是makefile文件,写完了之后就可以使用make来生成可执行程序。
make原理
- make会在当前目录下找名字为“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件,也就是上图中,会找到mytest这个文件,并把这个文件作为最终的目标文件。简单来说就是看看makefile中的第一个目标文件是否存在,也就是mytest是否存在。
- 但是一开始这个文件是不存在的,或者mytest的所依赖的文件被修改了或者说根据文件的修改时间,那就会通过依赖方法生成这个文件,也就是gcc编译生成一个文件。
使用stat命令就可以查看文件的修改时间。
这也是Linux下文件的ACM。
- 如果mytest所依赖的文件(test.c)不存在,那么make会在makefile文件中寻找目标为mytest依赖的文件(test.c)的依赖关系(例如test.c: ... ),如果找到则再根据其依赖方法生成test.c文件,但是上面实例中没有可以生成test.c的依赖关系。
- 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。
Makefile文件的简写方式:
- $@:表示依赖关系中的目标文件(冒号左边,例如mytest)。
- $^:表示依赖关系中的依赖文件列表(冒号右边全部,上面的例子只有一个)。
下面就是简写的样式
项目清理
- 项目是需要被清理的。
- clean这个就是清理的依赖关系,通常命名成clean,它不需要依赖任何文件,使用的时候直接输入make clean命令就可以执行下面的依赖方法。
- clean通常要设置为伪目标,使用.PHONY修饰后,无论输入多少次都会执行这句,如果不修饰,就会出现这样的情况。
修饰后就会一直执行
Linux调试器gdb
程序的发布方式有两种,分别是debug和release。Linux下gcc和g++编译出来的二进制可执行程序默认是release的,想要变成debug模式就要加-g选项。
之后就可以进入gdb调试界面了。
gdb会记录最近一条命令,如果还想使用这个命令,可以直接使用回车。接下来就开始介绍需要使用的命令。
r/run:开始调试,类似于vs下的f5,如果没有设置断点就直接结束 b(break)+行号:在这一行打断点 i(info)+b(breakpoint):查看当前所有断点 d(delete)+断点编号:删掉这一行的断点 n(next):逐过程,类似f10 s(step):逐语句,类似f11 p(print):打印表达式的值 bt(breaktrace):查看各级函数调用及参数,相当于查看调用堆栈 finish:执行到当前函数返回 display+变量名:跟踪查看一个变量,每次停下都显示它的值 undisplay+常显示编号:取消常显示 until+行号:跳转至该行 c(continue):从当前位置开始运行到下一个断点处 disable+断点编号:禁用断点 enable+断点编号:启用断点 q(quit):退出gdb
这些就是常用的命令,熟能生巧,多多练习才可以熟练的使用。