700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux —— 基础开发工具的基本使用 —— yum vim gcc make和makefile gdb的简单应用

Linux —— 基础开发工具的基本使用 —— yum vim gcc make和makefile gdb的简单应用

时间:2019-01-16 16:45:39

相关推荐

Linux —— 基础开发工具的基本使用 —— yum vim gcc make和makefile gdb的简单应用

目录

1.由生活常识引发的思考2.yum的概念与使用2.1yum的概念2.2yum的使用 3.vim的概念和使用3.1vim的概念3.2vim的基本操作3.2命令模式、插入模式、末行模式的关系3.3命令模式下的操作(常用)3.4末行模式下的操作(常用)3.5vim的配置 4.gcc/g++的使用4.1编译链接的详细过程4.2对链接的感性认识 5.make和makefile6.gdb的简单应用

1.由生活常识引发的思考

在我们平时使用电脑、手机的时候,如果没有软件、应用的存在,估计我们也不会有巨量的信息交互和生活的色彩。

我们仔细想想,当我们开机一台新电脑时,操作系统是不是会帮我们预装一些软件?例如浏览器,然后我们通过浏览器查找我们编写C++代码的编译器然后下载到我们的电脑上来。我们再运行编译器就可以编写C++代码了!

对于Linux操作系统来说,也需要软件!也需要应用商店、编译器、记事本……等等软件。但是Linux并不是可视化的操作系统,所以操作系统的行为都是通过指令完成的,也就是说,Linux的指令就是软件

2.yum的概念与使用

2.1yum的概念

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。

在电脑上,我们下载某个软件的通用途径是通过浏览器定位此软件的官网,然后通过下载链接进行下载;在手机上,我们通过手机自带的应用商城进行应用的下载。那么这些软件是如何被下载的?

事实上软件是被放在某个服务器上的,当我们与此服务器建立了联系之后,我们就可以下载了。那么建立联系的途径就是下载链接。正如刚才所说,在电脑端,通过官网的下载链接与其软件对应的服务器建立联系,然后进行下载;在手机端,应用商店整合了绝大部分的软件下载链接,当我们点击下载按钮,自动帮我们通过下载链接与服务器产生联系。

那么在Linux中,yum就充当了应用商店这个角色。我们所有的下载、安装、卸载工作都会通过yum。Linux作为开源的操作系统,其几十年的发展历史促进了很多优秀的、大佬级别的程序员为其开发免费的应用软件。这些应用软件被放在了Linux对应的社区服务器上。事实上我们并不需要担心Linux如何找到对应的软件服务器,作为开源操作系统,这些问题对应大佬来说根本不是问题。

那么Linux呢是国外的操作系统,软件对应的服务器呢也在国外。对于中国境内来说,访问国外的服务器不仅速度慢、而且存在安全隐患。所以国内的软件服务器镜像了国外的软件服务器。如果我们使用的Linux是购买而来的云服务器的话,其中服务器的很多配置都是已经完成好了的。

2.2yum的使用

Linux作为没有可视化界面的操作系统,其yum并不像手机上的应用商店那么直观,甚至我们根本不知道在Linux上需要什么东西(听起来很荒唐但事实上确实如此)。所以yum是具有软件罗列功能的,通过yum list这条命令便可以浏览yum中所有的软件:

不过这似乎没有针对性,并且这可是全局浏览,会将所有的软件昵称输出出来。我么并不像这样做,我们可以通过yum search [软件关键字]来进行软件查找。

但事实上这个命令我不喜欢。我们通过管道和grep命令配合,可以有更好的、更舒服的输出效果:

确定好了软件在哪,现在来看看如何下载。下载的命令为:yum install [选项] [软件昵称]。选项我们一般不写,不写的话在安装时会询问我们是否确定安装,如果我们不喜欢被询问,可以使用-y选项来默认确定安装。

下载安装完成之后我们直接输入软件的昵称即可运行:

卸载软件也非常简单,指令为:yum remove [选项] [软件]

3.vim的概念和使用

3.1vim的概念

vim是一款多模式的编辑器,不仅可以用来查看文档,还可以用来编写代码。因为vim可以通过配置达到文本高亮、自动补齐的效果。

vim事实上有12种切换模式,但是作为初学者,只需掌握三种即可,分别是:命令模式,插入模式,末行模式。

1.命令模式,通常又称正常/普通模式。我们可以在此模式下进行光标的移动,进行字符、行的删除,以及复制、剪切、粘贴等操作。

2.插入模式,又称编辑模式。只有在此模式之下才能输入文字。

3.末行模式,通常用来保存、关闭文件。

3.2vim的基本操作

我们可以直接vim [文件名]进入vim,如果文件不存在,那么将会自动创建。

一开始进入vim,所处的模式默认为命令模式。此时我们想要输入文字的话,就必须进入插入模式,那么此时我们只要按下键盘的[i]键,就可以进入插入模式。退出插入模式的话,按下[Esc]键即可。

那么我们输入完成之后,想要保存退出的话,就必须回到命令模式,然后再进入末行模式。进入末行模式我们需要按下[shift + ;]两个组合键,即在命令模式下按下冒号。

那么末行模式对应的常用指令有:[q],退出;[q!],强制退出;[w],保存;[w!],强制保存;[wq!],强制保存退出。

我们可以再通过vim指令进入vim浏览test.c文件的内容。也可以通过cat指令。

3.2命令模式、插入模式、末行模式的关系

刚才提到过,进入插入模式或者末行模式,都必须经过命令模式。也就是说,插入模式和末行模式之间不能切换。这里可以给出三种模式之间的关系:

3.3命令模式下的操作(常用)

刚才提到,命令模式下可以控制光标的移动。事实上我们可以通过方向键来移动,但是老牌的做法是:[h],左移;[j],下移;[k],上移;[l],右移。

按下[G]可以直接定位到文章的末端。注意是大写G,也就是shift+g的组合键。

按下[gg]可以直接定位到文章的开头。注意是连续两次按下小写g。

按下[$]直接定位到本行行尾。这样是个组合键,shift+4。

按下[^]直接定位到本行开头

按下[x]删除光标所对应的字符。注意这是个小写的x。

按下[X]删除光标所在的前一个字符。注意这是个大写的X。

按下[dd]直接删除光标所在行这个动作等同于剪切

按下[p]将缓冲区的内容粘贴到光标所在位置

那么按下[yy]就是将光标所在行的内容复制到缓冲区了

如果我们误操作,我们还可以进行撤销与恢复操作,按下 [u]等同于windows下的[Ctrl z],按下 [Ctrl r]等同于windows下的[Ctrl y]

3.4末行模式下的操作(常用)

上面介绍过末行模式可以控制文件的保存、关闭等操作,这里不再赘述了。那么末行模式当然不可能只有这些操作,我们还有其他的操作。

输入“set nu”,会在文件的每一行之前列出行号

输入“某个数字”,光标就会定位到指定数字的行

输入“?关键字"或者”/关键字"可以使文件内容出现关键字的地方高亮

输入"nohl"即可取消高亮

3.5vim的配置

每一个用户可以配置一份vim,每个用户之间的配置相互独立,互不干扰。vim的配置有何作用?如果是没有配置过的用户,那么在原生的vim中敲代码的话,可以发现,没有语法高亮,没有格式自动补齐,没有语法补齐提示……在这样的环境下进行代码的编写是非常难受的。

我们可以先浏览一下系统默认的、公用的vim配置文件。此文件在/etc目录下名为vimrc

我们可以使用vim指令打开此文件,浏览其内容:

但是系统的公用配置并不满足我们的需求,而且对应每个用户来说,都有不同的个性。我们便可以自定义配置文件。

我们需要在我们用户自己的家目录下创建一个名为 .vimrc 的文件

此文件是隐藏的,想要浏览隐藏文件的话可以使用 “ll -la” 命令

使用vim命令打开.vimrc文件,进行编辑。因为如果我们手动去配置的话,是非常麻烦的,这里列举一些简单的配置文件:设置深色背景:set background=dark;显示行号:set nu。将这些内容写入.vimrc文件。

写入后使用"source"命令,确认配置

此时简单的vim配置就做好了,下次进入vim时就会获得全新体验。

我们有懒人的操作模式,那就是在gitee上搜索VimForCpp。

将此链接直接复制,作为指令:

curl -sLf /HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

配置好后,再使用vim打开刚才编辑的文件:

至于是什么感觉,大家自行配置,自行体验!

4.gcc/g++的使用

gcc和g++是LInux下的一款编译器,如果大家的Linux下还没有安装gcc,那么请使用上面提到的yum下载安装gcc。

gcc和g++的用法是一致的,那么下面就以C语言代码,使用gcc做演示。

我们知道一个源文件想要生成可执行文件,必须经过两个步骤,一是编译,而是链接。而gcc和g++能够帮助我们完成这两项工作。

我们以一个程序为例子:

保存退出后,检查一下源文件是否正常保存:

此时正常保存,现在就要使用gcc编译器来对此源文件进行编译了。我们可以直接敲gcc [文件昵称]来编译源文件,那么编译链接完成后会默认生成一个名为 a.out 的可执行文件,因为我们没有指定编译链接完成后生成一个什么样的文件。

直接输入本目录下的可执行文件名即可运行:

如果我们嫌弃 a.out 这个名字不好听,我们还可以自定义生成可执行文件,指令是这样的gcc [源文件] -o [你想要的名字]

对应C++代码来说,使用g++的过程与gcc的过程是一样的。

4.1编译链接的详细过程

在C语言的某篇博客当中我们感性的认识了编译和链接,也就是只知道它有这么个过程,不知道它长什么样。那么在我们的Linux环境下,配合上gcc编译器,就可以看清楚编译链接是个什么样的过程啦!

我们知道预处理是把头文件展开、注释删除掉、进行宏替换等等,那我们就把上面的代码修改一下:

那么问题就在于,我们怎么让编译的阶段执行完预处理就停止呢?[-E]选项。我们可以配合 [-E] 选项让预处理完成之后生成后缀为 .i 的文件,这个 .i 文件就是我们要的预处理之后的结果。

我们使用vim打开它:

下一步就是进入编译了,编译呢就是检查语法有没有错误。如果没错,那就生成一份汇编代码。想要在完成编译的过程之后停止,就需要使用 [-S]选项(大写的S),生成的文件的名字后缀为 .s ,此 .s 文件就是编译之后的结果。

我们使用vim打开此.s文件:

生成了肉眼可见的汇编代码!

接下来就应该到了汇编这一步,光生成汇编代码是不够,因为计算机只认识二进制指令,这一步就是将汇编代码转成二进制。需要用到的选项是 [-c] 选项,生成的文件后缀为 .o ,也就是常说的目标文件啦!

我们使用vim打开此文件的话,就会发生这种事:

这是因为目标文件里面的内容都是二进制,当然看不懂了!

最后一步便是链接,gcc本身带有这个功能,最后生成的文件看我们自己喜好咯!

我们运行这个可执行文件测试一下我们的分析是否正确:

4.2对链接的感性认识

我们知道,头文件中放的一般都是声明,其定义在其他的源文件中。正如刚才的代码,我们要使用库函数printf就要包含头文件<stdio.h>,让我们的函数连接器知道有这个函数的声明,然后去库中找函数的定义。这就是链接的过程。

那么此过程分为两种,一种是动态链接,一种是静态链接

通俗的话来讲,动态链接要找的函数定义远一些,但是能省下非常多的空间;静态链接要找的函数定义就在身边,但是空间的占用是巨大的。怎么理解呢?请看图解:

那么我们看看刚才我们编译链接的程序是动态链接呢?还是静态链接呢?我们使用file [文件名]命令。

可以看见Linux的默认链接方法是动态链接

再观察一下动态链接的文件大小:

既然默认的链接方法是动态链接,那我们怎么看静态链接?很简单,只需在链接的指令后面加一个静态链接选项 [-static]

再观察一下静态链接产生的文件大小:

5.make和makefile

makefile是一个项目自动化构建的工具,make是一个指令

其用途表现在当我们写的源文件不止一个时,方便我们进行编译链接。也就是说,makefile关乎于一个程序员的项目能力。

makefile能够指定编译链接的规则、顺序,而且只需要进行一次代码编写(脚本语言)即可。

我们以刚才的程序为例,首先需要与源文件一起,创建一个名为 makefile/Makefile的文件

然后打开vim对其进行编辑:需要注意,依赖必须以 [tab] 开头

保存退出便可以实现一个简单的项目自动化构建了:

当我们已经产生了一个可执行文件,再进行make的话,就会发生这样的事:

但是我们使用make clean 命令清除的话,就没有限制:

那这是为什么?是因为在编译makefile的时候多了一句 .PHONY:clean 吗?我告诉大家答案,是。但是为什么加上了就可以一直编译或清除了呢?我们看看源文件与可执行文件的时间:

可执行文件的修改时间总是比源文件的修改时间晚说明什么?说明在可执行程序建立之后,源文件没有被修改过。既然没有被修改过,那我一直make有什么意义?所以在makefile中,不加 .PHONY:伪目标 ,就是默认了只做有意义的编译,而如果加上,那就不受这个限制啦!

那么现在编译就可以无拘无束了!

6.gdb的简单应用

如果我们设计的程序最终答案不符合我们预期的时候,我们很可能会使用一些调试工具。那么在Linux操作系统下有一款名为gdb的调试工具。

但是因为Linux并不是可视化的操作系统,所以使用gdb调试代码会比较困难,当然往后也不会使用gdb调试。

但我们作为学者,一些简单的调试方法我们还是有必要掌握的

我们试想一下,如果我们在VS环境下调试代码,常用的几个方法无非就这么几个:打一个断点,开始调试,逐过程或者逐语句,监视。那么我要介绍的就是这几个调试方法。注意,在进行调试之前,确保gdb是已经下载安装好的。

我们对test.c文件写入一些代码:

编译的时候要注意了,使用gcc编译生成的代码版本是release版本的,是不能够进行调试的。我们必须在编译时加上[-g]选项。

然后使用gdb命令,直接对可执行文件操作,即可进入调试状态:

此时并没有代码显示出来,这就非常不方便了,我们输入[l 0]或者 **[l 1]**命令,让代码从第0行或者第1行显示出来(小写的L加数字):

此时就到关键的部分了,使用[b] [行数]命令,即可在对应的行数代码前打上断点:

注意了,如果要删除断电的话,要使用[d] [Num]命令,这个Num对应上图的Num。

然后就需要进入调试了,我们使用的命令为[r]

那么我们看到,15行的代码有函数调用,如果我们想调试此函数,那么就使用[s]命令,逐语句进入到函数内部观察函数内部发生了什么:

此时我们想观察某些变量的值,我们就使用[display] [变量名]命令即可:

我们使用[n]命令就可以逐过程的调试代码。

但是这个函数里面有100次循环,我们不想逐步调试,我们可以输入[finish] 命令,直接跳到函数的返回值语句

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。