在Lniux中编译代码的工具 —— vim和gcc/g++的使用

目录

??前言

??1. 什么是vim

??2. vim的使用

vim的基本操作:

??3. 命令模式下的命令集

??4. 底行模式下的命令集

??5. vim的个性设置 

??6. gcc/g++的使用

?? 扩展:程序从编译到运行的翻译过程

预处理(进行宏替换):

编译(生成汇编):

汇编(生成机器可识别代码):

链接(生成可执行文件或库文件):

?? 扩展:函数库

?? 总结:


??前言

        这篇文章会围绕如何在Linux中编译和编辑代码进行讲解,其中会讲解vim是什么,vim的模式有哪些,在不同模式下的命令,以及如何个性化配置自己的vim,最后通过gcc/g++编译自己的代码。

        其中,文章会花费大长篇幅讲解vim在不同模式下的命令集,当然这也是非常简单的,不需要可以去记住,熟能生巧。

??1. 什么是vim

        在Linux系统中,绝大部分的配置文件都是以ASCII的纯文本形式存在的,因此利用简单的文本编辑软件就能修改设置了,这就要求我们系统管理员至少要熟悉一种文本处理工具。

        什么是纯文本文件?文件记录的都是0和1,而我们编码系统讲这些0和1转成我们认识的文字,。纯文本文件中只有换行,制表符等少数格式控制字符和一般的可见字符。ASCII就是其中一种广泛使用的文字编码系统。

        那Linux有很多文本编辑器,如emacs,pico,nano与vim等。既然这么多,为什么要学习vim呢。接下来我们了解一下vim的优点吧。

        在介绍vim之前,我们还要说一下vim的前身vi,vi也是一款文本编辑器,因为太过于老旧,被vim所替代,你也可以将vim视为vi的高级版本。

vi / vim的优点:

        1. 所有的UNIX-like系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在;

        2. 很多软件的编辑接口都会主动调用vi;

        3. vim具有程序编辑能力,可以主动以字体颜色辨别语法的正确性,方便程序设计;

        4. 因为程序简单,编辑速度快;

                                                                                                ——《鸟哥的Linux私房菜》

        举例来说,当你使用vim去编辑一个C语言程序文件时,vim会根据文件的扩展名或是文件内的开头信息,判断文件的内容而自动调用程序的语法判断样式,在以颜色来显示程序代码与一般样式,此外vim可以直接帮你进行程序出错(debug)功能。因此,vim也可以是程序编辑器。

        讲到这里,我们已经讲解了什么是vim,为什么要学vim了。总结一下,vim是一款文本编辑器,也是一款程序编辑器。通过学习vim,我们就可以在Linux上编辑我们的代码了。        

??2. vim的使用

        vim的模式总共有12:命令模式(普通模式)插入模式(编辑模式)底行模式(命令行模式)替换模式可视模式。当然不同地方对这五个模式有不同的名称。这里我们只需要学习前三个即可。

● 命令模式:

        控制屏幕光标的移动,字符,子或行的删除。移动复制某区段进入Insert mode(插入模式)下,或者进入last line mode(底行模式)。

● 插入模式:

        只有在插入模式下,才可以进行文字的出入,按ESC可以返回命令模式。该模式也是我们后面最常频繁的编辑模式。

● 底行模式:

        文本的保存和退出,也可以进行文本替换,找字符,列出行号等操作。在命令模式下,按shift+;即可进入该模式。

vim的基本操作:

1.【正常模式】切换至【插入模式】:        

输入a:从当前位置的下一个位置进入【插入模式】

● 输入o:从当前行的下一行进入【插入模式】

输入i:从当前位置进入【插入模式】

2.【插入模式】切换至【正常模式】:

● 按ESC

【正常模式】切换至【底行模式】:

● shit + ;其实就是输入;

3. 退出vim

        先从【正常模式】切换至【底行模式】,再在底行模式下输入:

● w :保存当前文件。

● q! : 不存盘,强制退出。

● wq : 保存并退出。 

??3. 命令模式下的命令集

进入插入模式:

● 按[ i ]切换进入插入模式,即从光标当前位置开始输入文件。

● 按[ a ]切换进入插入模式,即从当前光标的下一个位置开始输入文字。

● 按[ o ]切换进入插入模式,即插入新的一行,从行首开始输入文字。

从插入模式切换至命令模式:

● 按[ ESC ] 键

移动光标:

● vim可以使用键盘上的↑↓→←按键来控制上下左右移动,但正规的vim是用小写字母h , j , k , l ,分别控制光标的左,下,上,右移一格。

● G : 移动到文章的最后。

● shift + 4 ($) : 移动到光标所在行的行尾。

● shift + 6 (^):移动到光标所在行的行首。

● w:光标跳到下个字的开头。

● e: 光标跳到下个字的字尾。

● b:光标回到上个字的开头

● gg:回到文章的开始

● shift + g : 进入文章末端

删除文字:

● x:删除光标所在位置的一个字符。(从前往后)

● shift + x:从后往前删除光标所在位置。

● dd:删除光标所在行。

复制:

● yy : 复制当前行。

●p:拷贝当前行

替换:

● r:进入替换模式,替换光标所处的字符。

撤销上一步操作:

● u : 误执行一个命令,回到上一个命令。

● ctrl + r:撤销恢复,即撤销的撤销。

        以上操作部分可以带数字执行,即[ n ] + 命令,例如 4 + shift + g 就是跳转到第4行。这里为了不增加学习压力,所以没有上述命令没有给出,如果感兴趣可以下来自己实验。

??4. 底行模式下的命令集

● 列出行号

        su nu

● 查找字符

        /字符

● 保存文件

        w

● 离开vim

        q: q就是退出,如果无法离开,就在后面+!,强制离开vim。

        wq:保存退出。

??5. vim的个性设置 

        vim的原生配置可能不太齐全,所以使用起来并不是很方便,比如我们想用代码补齐,vim并不会自带,但是vim支持安装插件,我们可以选择安装插件来完善配置。

        这里,给大家推荐GiteeS上的一个项目,可以快速帮助大家完成个性配置:

VimForCpp: 快速将vim打造成c++ IDE,点进去后,下滑,找到一行指令,在Linux中输入即可,注意,要确保用户不能是root!!!否则,会出现兼容性等一系列问题。

??6. gcc/g++的使用

        以上,我们对vim有了一定了解,vim是一款文本编辑器和代码编辑器,编辑好我们的代码后,我们就要对代码进行编译,gcc/g++就是用来编译我们代码的工具。

        gcc:编译C语言代码

        g++:编译C/C++语言代码。

        这里扩展一下,C++程序文件,可以是.cc,.cxx,.cpp为后缀名的。当然Linux系统是不以后缀名区分文件的,但是vim和gcc/g++这些软件会区分。

格式 : gcc/g++  [选项] 要编译的文件 [选项] [目标文件]

        一般情况下,不指定文件名,只需要gcc/g++ filename即可,默认生成a.out可执行文件。当然我们也可以带上-o 选项,即可命令生成的可执行文件。

?? 扩展:程序从编译到运行的翻译过程

        以上代码经过预处理,编译,汇编,链接生成我们的可执行程序。

预处理(进行宏替换):

实例: gcc –E hello.c –o hello.i

●预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
●预处理指令是以#号开头的代码行。
●选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
●选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

编译(生成汇编):

实例: gcc –S hello.i –o hello.s

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
 

汇编(生成机器可识别代码):

实例: gcc –c hello.s –o hello.o

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

链接(生成可执行文件或库文件):

gcc hello.o –o hello
在成功编译后,就进入了链接阶段。

?? 扩展:函数库

        在C语言中,我们知道,printf是库函数的一种,但在程序中,没有定义printf函数的实现,且在预处理阶段包含的“stdio.h”中也只有函数的声明,而没有定义函数的实现,那么哪里实现printf函数呢?

        在Linux系统中,这些函数的实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc回到系统默认搜索路径“/usr/lib”下进行查找,也就是连接到libc.so.6库函数中去,这样就能实现printf函数了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种:

        ● 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
        ● 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。

        gcc默认生成的二进制程序,是动态链接的。

?? 总结:

        以上,我们对Linux中如何编辑和编译代码做了解,也给出如何操作vim即gcc/g++,同样的也给出两个扩展。同样的,这两个扩展也是非常重要的,对于一名合格的Linux,C/C++工程师来说,了解这些是非常有必要的。因为本文的重点不是这,所以也只是粗略的讲解了一下,并没有深入讲解。如果大家对此感兴趣,可以再评论区留言讨论,博主会对此发布新文章进行讲解。

        最后,希望大家在评论区积极讨论,点赞,收藏,关注Thanks?(?ω?)?