文章目录
- Linux软件包管理器yum
- 关于rzsz
- 安装与卸载示例
- 注意事项
- Linux开发工具vim
- vim基本操作总结
- 插入模式:
- 移动光标快捷键
- 删除文字
- 复制
- 替换
- 撤销上一次操作
- 更改
- 跳至指定的行
- 多文件操作
- 底行模式
- sudo
- Linux编译器gcc/g++的使用
- 预处理
- 编译
- 汇编
- 链接
- 生成可执行文件
- 总结
- 详谈链接
- debug和release
- Linux项目自动化构建工具make/Makefile
Linux软件包管理器yum
软件包和软件包管理器分别是什么?为了更好地理解他们之间的关系,我们可以拿手机上的应用来阐述,软件包就相当于手机上的各种APP,而软件包管理器就相当于与应用商店,是用来下载他们的地方,Linux中的yum就是扮演着应用商店这个角色。
关于rzsz
作用:这个工具用于Windows机器和远端Linux机器通过Xshell传输软件
安装完毕之后也可以通过拖拽到Xshell界面的方式将Windows文件传输到Linux机器中
rz:接收文件
sz:将Linux中文件保存至本地
安装与卸载示例
以上面的rzsz工具为例,在安装软件之前要保证网络的畅通
通过yum list指令可以罗列出所有的软件包,因为软件包太多我们不容易去找,我们可以通过管道的方式去删选出特定的安装包,例如
通过yum list | grep lrzsz指令可以筛选出对应的安装包
筛选结果如下
安装软件由于需要向系统目录中写入内容,一般需要sudo或者切换到root账号下,才能完成
卸载也是通过一条指令来完成,如下:
注意事项
软件包名称:主版本号,次版本号,源程序发行号-软件包的发行号,平台主机,CPU框架
“x86_64”后缀表示64位系统的安装包,“i686”后缀表示32位系统的安装包,选择安装包时要和系统匹配
“el7”表示操作系统发行版的版本,“el7”表示的是centos7/redhat7,“el6”表示的是centos6/redhat6
最后一列OS表示的是“软件源”的名称,类似于华为应用商店,小米应用商店等
Linux开发工具vim
vim是一个多模式的编辑器,分别是命令模式,插入模式,底行模式各模式的功能区分如下:
正常/普通/命令模式(Normal mode):
控制光标的移动,字符、字或行的删除,移动复制某区段及进入insert mode下,或者到last line mode
插入模式(insert mode):
只有在insert mode下,才可以做文字输入,按[Esc]键可回到命令行模式。该模式被频繁使用。
末行模式(lsat line mode):
文件保存或退出,也可进行文件替换,找字符串,列出行号等操作。在命令模式下shift+:即可进入该模式。
要查看你所有的模式:打开vim,底行输入:help vim-modes即可
vim基本操作总结
插入模式:
按[i]切换进入插入模式,按“i”进入插入模式后是从光标当前位置开始输入文件
按[a]进入插入模式之后,是从目前光标所在位置的下一个位置开始输入文字
按[o]进入插入模式之后,是从当前光标所在行后插入新的一行,然后从行首开始输入文字
按[O]进入插入模式之后,是从当前光标所在行前插入新的一行,然后从行首开始输入文字
移动光标快捷键
vim可以直接使用键盘上的上下左右键来进行光标的移动,但正规的vim是通过小写字母[h],
[j], [k], [l],分别控制光标向左,下,上,右进行移动
按[gg]回到文本开始
按[G] = 按shift + g移动到文本的末尾
按[$]移动到所在行的行尾
按[^]移动到所在行的行首
按[w]光标跳到下个字词的开头
按[e]光标跳到下个字词的字尾
按[b]光标回到上个字词的开头
按[#l]光标从当前位置在当行向后移动#个字符
按Ctrl + d屏幕向前移动半页
按Ctrl + f屏幕向前移动一页
按Ctrl + u屏幕向后移动半页
按Ctrl + b屏幕向后移动一页
删除文字
[x]:每按一次,删除光标所在位置的一个字符
[#x]:例如:[5x]表示删除光标所在位置后面的5个字符(包括自己在内)
[X]:大写X,每按一次,表示删除光标所在位置的前一个位置的一个字符
[#X]:例如[6X]表示删除光标所在位置前面的6个字符
[dd]:表示删除光标所在行
[#dd]:从光标所在行开始删除#行
复制
[yw]:将光标所在之处到字尾的字符复制到缓冲区中
注意是到字尾不是到行尾
[#yw]:复制#个字到缓冲区
[yy]:复制光标所在行到缓冲区
[#yy]:例如[6yy]表示复制光标所在行到向下数的6行文字(包括光标所在行)
[p]:将缓冲区内的字符粘贴到光标所在的位置
注意:所有与‘y’有关的复制命令都必须与‘p’配合才能完成复制与粘贴功能
替换
[r]:替换光标所在位置处的字符
[R]:替换光标所到之处的字符,直到按下[Esc]键为止
撤销上一次操作
[u]:撤销上一次操作,按n次可撤销前n次操作
[Ctrl + r]:撤销的恢复
更改
[cw]更改光标所在处的字到字尾处
[c#w]:例如[c3w]表示更改3个字
跳至指定的行
列出光标所在行的行号Ctrl + g
[#G]:例如[10G]表示移动光标至文章第10行的行首
多文件操作
在底行模式中输入vs加上文件名就会以多窗口形式去打开对应的文件
如图在底行中输入指令vs code1.cpp后结果如下:
可以通过Ctrl + ww进行窗口光标切换
并且如果code.cpp这个文件并不存在,也可以被打开,在写入文本之后如果被保存了,那么这个文件就会被自动创建。
底行模式
[set nu]:列出行号
[set nonu]:取消行号
[w]:保存文件
[q]:退出vim
[wq]:退出并保存
如果无法退出可以在[q]后面跟一个[!]进行强制退出
sudo
并非所有人都能执行sudo,只有规范到/etc/sudoers内的用户才能够执行sudo这个命令
普通用户默认情况下没有能执行sudo命令的权限
若想要让普通用户用sudo执行属于root的权限命令,则要先让root去修改/etc/sudoers
切换到root账号打开/etc/sudoers去修改
把Linux3这个用户添加到白名单中,在底行模式中wq!保存并退出
返回到普通用户发现此时拥有sudo命令权限了
注意在普通用户第一次执行sudo命令时输入的密码就是这个普通用户的密码
要想去掉这个普通用户的sudo权限时,只需登录root账号在/etc/sudoers文件中把该用户删除即可
Linux编译器gcc/g++的使用
gcc用于编译C语言,g++用于编译C++,当然也可以用于编译C语言
源文件在由编译器生成可执行文件时,编译要经历四个过程
1.预处理
2.编译
3.汇编
4.链接
我们接下来一次观察这四个阶段生成的文件有什么变化
预处理
预处理阶段完成宏替换,去注释,头文件展开,条件编译等操作
如果要只让文件只完成到预处理阶段就停下来,则要进行一下操作
上述操作:先创建文件test.c,然后使用gcc编译器生成文件test.i,这里解释一下 -E 选项的作用,-E就是告诉编译器从现在进行程序的翻译,将预处理工作完成之后,就停下来,不要往后面走了
如果不加-o,则直接将生成的预处理文件内容打印出来
如果加上-o自定义命名生成的文件名称,-o后面紧跟要生成的文件名称
则创建对应的-o文件并不打印
在底行模式中输入vs test.i对比两个文件
此时我们可以看到生成的test.i文件中包含被展开的头文件,并且完成了宏替换,条件编译,去注释操作
编译
编译的结果是生成对应的汇编指令,以及完成语法分析,词法分析,语义分析,符号汇总等工作
-S的作用是从现在开始进行程序的翻译,将编译工作完成就停下来
对比结果如下:
可以看到此时程序完成了编译生成了对应的汇编指令
汇编
汇编的作用是生成将汇编指令生成机器可识别的二进制代码
-c作用是从现在开始进行程序的翻译,将汇编工作完成之后就停下来
生成的test.o称为可重定位目标二进制文件,简称目标文件,在Windows中生成的格式是.obj文件,注意此文件此时不可以独立执行,虽然已经是二进制了,但需要经过链接才能执行
可以看到即使我们给test.o加上可执行权限,它也是不可以被执行的
这点需要注意在Linux中一个文件即使具有可执行权限但是它没有可执行能力它也是不可以被执行的,具有权限和具有能力是不同的
链接
这一步我们叫做链接过程,作用是将可重定位二进制文件和库进行链接形成可执行程序
生成可执行文件
如果在直接生成可执行文件时,不加-o选项默认生成的可执行文件名称为a.out
我们也可以加上-o选项生成对应的自定义名称可执行文件,这里命名为自定义命名为mytest
注意在生成各种文件的过程中,后缀不是必须为对应的iso的,只不过为了容易区分加上了对应的后缀名,一般建议加上
总结
完成到预处理阶段就停下来加选项-E
生成的对应文件后缀为.i
完成到编译阶段就停下来加选项-S
生成的对应文件后缀为.s
完成到汇编阶段就停下来加选项-c
生成的对应文件后缀为.o
生成可执行程序加上-o
链接这一步我们是没有加其它选项的只有一个-o生成自定义文件名对应的可执行文件
快速记忆:ESc 和 iso(镜像文件名的后缀)
详谈链接
链接的作用是什么呢?我们在编写代码时,例如使用的cout,printf等本质上都是函数,而这些函数并不是我们自己实现的,它是已经定义在库中的函数,我们只需在链接时调用它即可,而库又分为静态库和动态库
动态库在编译链接时,并没有把库中的内容导入到可执行文件中,而是在程序运行时由运行时链接文件加载库,gcc,g++在编译时默认优先链接动态库
什么是静态库?静态库就是打包好的一个文件,在后续程序运行时把这个文件导入到我们的程序文件中,我们可以手动的去让一个程序去链接静态库,具体操作如下:
系统中默认是没有静态库的,要想链接静态库我们需要自己先去下载静态库
C语言静态库的下载方式如下
C++静态库的下载方式如下:
让程序去链接静态库而不是动态库操作如下:
可以看到静态链接生成的可执行程序mytest_static比动态链接生成的可执行程序mytest体积要大的多,这是因为静态链接是把库中的内容都放到了这个可执行文件中
以上是通过file指令对默认生成的可执行程序mytest和指定用静态库链接的方式去链接生成的可执行程序mytest_static进行验证的结果,可以看到默认优先链接的是动态库,在指定条件下才去链接静态库
动静态链接的优缺点:
动态库因为是共享库,所以可以有效地节省资源(磁盘资源,内存资源),但是动态库一旦缺失,就会导致各个程序无法运行
静态库,不依赖库,程序可以独立运行,体积大比较耗费资源
debug和release
可执行程序默认生成的是release版本,要想让它生成debug版本的可执行程序要加上-g选项
可以看到在动静态链接中debug版本都比对应的release版本体积要大,这是因为debug版本中添加了调试信息,而release版本是发行版本去掉了相关的调试信息
Linux项目自动化构建工具make/Makefile
在VisualStudio中我们可以使用快捷键Ctrl+F5就可以完成整个项目中个个源文件的编译运行,而在Linux中我们在此之前都是使用gcc或g++命令对项目中的每一个文件依次进行编译,那么在Linux中是否也有类似的编译和清理项目后重新编译的快捷方式呢?make和Makefile就是用来完成项目自动化构建的。
make是一条命令,makefile是一个文件,两者搭配使用。
makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
Makefile带来的好处就是自动化编译,一旦写好只需一个make命令,整个工程就可完成自动编译,极大的提高了软件开发的效率
make是一个命令工具,是一个解释Makefile中指令的命令工具。
通俗来讲,就是把要编译项目时的命令,全部写在Makefile这个文件中,然后通过make命令去执行Makefile这个文件中的指令,一次写好之后,在后续再要编译项目时只需执行make命令即可。清理项目的指令也可放在Makefile这个文件中。
创建一个文件命名为makefile文本内容如上
make指令自上而下执行默认执行第一条,要想执行clean需要在make后面加上对应的clean