在我们平时使用电脑、手机的时候,如果没有软件、应用的存在,估计我们也不会有巨量的信息交互和生活的色彩。
我们仔细想想,当我们开机一台新电脑时,操作系统是不是会帮我们预装一些软件?例如浏览器,然后我们通过浏览器查找我们编写C++代码的编译器然后下载到我们的电脑上来。我们再运行编译器就可以编写C++代码了!
对于Linux操作系统来说,也需要软件!也需要应用商店、编译器、记事本……等等软件。但是Linux并不是可视化的操作系统,所以操作系统的行为都是通过指令完成的,也就是说,Linux的指令就是软件。
yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。
在电脑上,我们下载某个软件的通用途径是通过浏览器定位此软件的官网,然后通过下载链接进行下载;在手机上,我们通过手机自带的应用商城进行应用的下载。那么这些软件是如何被下载的?
事实上软件是被放在某个服务器上的,当我们与此服务器建立了联系之后,我们就可以下载了。那么建立联系的途径就是下载链接。正如刚才所说,在电脑端,通过官网的下载链接与其软件对应的服务器建立联系,然后进行下载;在手机端,应用商店整合了绝大部分的软件下载链接,当我们点击下载按钮,自动帮我们通过下载链接与服务器产生联系。
那么在Linux中,yum就充当了应用商店这个角色。我们所有的下载、安装、卸载工作都会通过yum。Linux作为开源的操作系统,其几十年的发展历史促进了很多优秀的、大佬级别的程序员为其开发免费的应用软件。这些应用软件被放在了Linux对应的社区服务器上。事实上我们并不需要担心Linux如何找到对应的软件服务器,作为开源操作系统,这些问题对应大佬来说根本不是问题。
那么Linux呢是国外的操作系统,软件对应的服务器呢也在国外。对于中国境内来说,访问国外的服务器不仅速度慢、而且存在安全隐患。所以国内的软件服务器镜像了国外的软件服务器。如果我们使用的Linux是购买而来的云服务器的话,其中服务器的很多配置都是已经完成好了的。
Linux作为没有可视化界面的操作系统,其yum并不像手机上的应用商店那么直观,甚至我们根本不知道在Linux上需要什么东西(听起来很荒唐但事实上确实如此)。所以yum是具有软件罗列功能的,通过 yum list 这条命令便可以浏览yum中所有的软件:
不过这似乎没有针对性,并且这可是全局浏览,会将所有的软件昵称输出出来。我么并不像这样做,我们可以通过 yum search [软件关键字] 来进行软件查找。
但事实上这个命令我不喜欢。我们通过管道和grep命令配合,可以有更好的、更舒服的输出效果:
确定好了软件在哪,现在来看看如何下载。下载的命令为:yum install [选项] [软件昵称] 。选项我们一般不写,不写的话在安装时会询问我们是否确定安装,如果我们不喜欢被询问,可以使用 -y 选项来默认确定安装。
下载安装完成之后我们直接输入软件的昵称即可运行:
卸载软件也非常简单,指令为:yum remove [选项] [软件] 。
vim是一款多模式的编辑器,不仅可以用来查看文档,还可以用来编写代码。因为vim可以通过配置达到文本高亮、自动补齐的效果。
vim事实上有12种切换模式,但是作为初学者,只需掌握三种即可,分别是:命令模式,插入模式,末行模式。
1.命令模式,通常又称正常/普通模式。我们可以在此模式下进行光标的移动,进行字符、行的删除,以及复制、剪切、粘贴等操作。
2.插入模式,又称编辑模式。只有在此模式之下才能输入文字。
3.末行模式,通常用来保存、关闭文件。
我们可以直接 vim [文件名] 进入vim,如果文件不存在,那么将会自动创建。
一开始进入vim,所处的模式默认为命令模式。此时我们想要输入文字的话,就必须进入插入模式,那么此时我们只要按下键盘的 [i] 键,就可以进入插入模式。退出插入模式的话,按下 [Esc] 键即可。
那么我们输入完成之后,想要保存退出的话,就必须回到命令模式,然后再进入末行模式。进入末行模式我们需要按下 [shift + ;] 两个组合键,即在命令模式下按下冒号。
那么末行模式对应的常用指令有:[q],退出;[q!],强制退出;[w],保存;[w!],强制保存;[wq!],强制保存退出。
我们可以再通过vim指令进入vim浏览test.c文件的内容。也可以通过cat指令。
刚才提到过,进入插入模式或者末行模式,都必须经过命令模式。也就是说,插入模式和末行模式之间不能切换。这里可以给出三种模式之间的关系:
刚才提到,命令模式下可以控制光标的移动。事实上我们可以通过方向键来移动,但是老牌的做法是:[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]。
上面介绍过末行模式可以控制文件的保存、关闭等操作,这里不再赘述了。那么末行模式当然不可能只有这些操作,我们还有其他的操作。
输入 “set nu”,会在文件的每一行之前列出行号。
输入 “某个数字”,光标就会定位到指定数字的行。
输入 “?关键字"或者”/关键字"可以使文件内容出现关键字的地方高亮
每一个用户可以配置一份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 https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
配置好后,再使用vim打开刚才编辑的文件:
至于是什么感觉,大家自行配置,自行体验!
gcc和g++是LInux下的一款编译器,如果大家的Linux下还没有安装gcc,那么请使用上面提到的yum下载安装gcc。
gcc和g++的用法是一致的,那么下面就以C语言代码,使用gcc做演示。
我们知道一个源文件想要生成可执行文件,必须经过两个步骤,一是编译,而是链接。而gcc和g++能够帮助我们完成这两项工作。
我们以一个程序为例子:
保存退出后,检查一下源文件是否正常保存:
此时正常保存,现在就要使用gcc编译器来对此源文件进行编译了。我们可以直接敲 gcc [文件昵称] 来编译源文件,那么编译链接完成后会默认生成一个名为 a.out 的可执行文件,因为我们没有指定编译链接完成后生成一个什么样的文件。
直接输入本目录下的可执行文件名即可运行:
如果我们嫌弃 a.out 这个名字不好听,我们还可以自定义生成可执行文件,指令是这样的 gcc [源文件] -o [你想要的名字] 。
对应C++代码来说,使用g++的过程与gcc的过程是一样的。
在C语言的某篇博客当中我们感性的认识了编译和链接,也就是只知道它有这么个过程,不知道它长什么样。那么在我们的Linux环境下,配合上gcc编译器,就可以看清楚编译链接是个什么样的过程啦!
我们知道预处理是把头文件展开、注释删除掉、进行宏替换等等,那我们就把上面的代码修改一下:
那么问题就在于,我们怎么让编译的阶段执行完预处理就停止呢?[-E]选项。我们可以配合 [-E] 选项让预处理完成之后生成后缀为 .i 的文件,这个 .i 文件就是我们要的预处理之后的结果。
我们使用vim打开它:
下一步就是进入编译了,编译呢就是检查语法有没有错误。如果没错,那就生成一份汇编代码。想要在完成编译的过程之后停止,就需要使用 [-S]选项(大写的S),生成的文件的名字后缀为 .s ,此 .s 文件就是编译之后的结果。
我们使用vim打开此.s文件:
生成了肉眼可见的汇编代码!
接下来就应该到了汇编这一步,光生成汇编代码是不够,因为计算机只认识二进制指令,这一步就是将汇编代码转成二进制。需要用到的选项是 [-c] 选项,生成的文件后缀为 .o ,也就是常说的目标文件啦!
我们使用vim打开此文件的话,就会发生这种事:
这是因为目标文件里面的内容都是二进制,当然看不懂了!
最后一步便是链接,gcc本身带有这个功能,最后生成的文件看我们自己喜好咯!
我们知道,头文件中放的一般都是声明,其定义在其他的源文件中。正如刚才的代码,我们要使用库函数printf就要包含头文件
那么此过程分为两种,一种是动态链接,一种是静态链接。
通俗的话来讲,动态链接要找的函数定义远一些,但是能省下非常多的空间;静态链接要找的函数定义就在身边,但是空间的占用是巨大的。怎么理解呢?请看图解:
那么我们看看刚才我们编译链接的程序是动态链接呢?还是静态链接呢?我们使用 file [文件名] 命令。
可以看见Linux的默认链接方法是动态链接!
再观察一下动态链接的文件大小:
既然默认的链接方法是动态链接,那我们怎么看静态链接?很简单,只需在链接的指令后面加一个静态链接选项 [-static] 。
再观察一下静态链接产生的文件大小:
makefile是一个项目自动化构建的工具,make是一个指令。
其用途表现在当我们写的源文件不止一个时,方便我们进行编译链接。也就是说,makefile关乎于一个程序员的项目能力。
makefile能够指定编译链接的规则、顺序,而且只需要进行一次代码编写(脚本语言)即可。
我们以刚才的程序为例,首先需要与源文件一起,创建一个名为 makefile/Makefile的文件。
然后打开vim对其进行编辑:需要注意,依赖必须以 [tab] 开头!
保存退出便可以实现一个简单的项目自动化构建了:
当我们已经产生了一个可执行文件,再进行make的话,就会发生这样的事:
但是我们使用 make clean 命令清除的话,就没有限制:
那这是为什么?是因为在编译makefile的时候多了一句 .PHONY:clean 吗?我告诉大家答案,是。但是为什么加上了就可以一直编译或清除了呢?我们看看源文件与可执行文件的时间:
可执行文件的修改时间总是比源文件的修改时间晚说明什么?说明在可执行程序建立之后,源文件没有被修改过。既然没有被修改过,那我一直make有什么意义?所以在makefile中,不加 .PHONY:伪目标 ,就是默认了只做有意义的编译,而如果加上,那就不受这个限制啦!
那么现在编译就可以无拘无束了!
如果我们设计的程序最终答案不符合我们预期的时候,我们很可能会使用一些调试工具。那么在Linux操作系统下有一款名为gdb的调试工具。
但是因为Linux并不是可视化的操作系统,所以使用gdb调试代码会比较困难,当然往后也不会使用gdb调试。
但我们作为学者,一些简单的调试方法我们还是有必要掌握的。
我们试想一下,如果我们在VS环境下调试代码,常用的几个方法无非就这么几个:打一个断点,开始调试,逐过程或者逐语句,监视。那么我要介绍的就是这几个调试方法。注意,在进行调试之前,确保gdb是已经下载安装好的。
编译的时候要注意了,使用gcc编译生成的代码版本是release版本的,是不能够进行调试的。我们必须在编译时加上 [-g] 选项。
然后使用gdb命令,直接对可执行文件操作,即可进入调试状态:
此时并没有代码显示出来,这就非常不方便了,我们输入 [l 0] 或者 **[l 1]**命令,让代码从第0行或者第1行显示出来(小写的L加数字):
此时就到关键的部分了,使用 [b] [行数] 命令,即可在对应的行数代码前打上断点:
注意了,如果要删除断电的话,要使用 [d] [Num] 命令,这个Num对应上图的Num。
然后就需要进入调试了,我们使用的命令为 [r] 。
那么我们看到,15行的代码有函数调用,如果我们想调试此函数,那么就使用 [s] 命令,逐语句进入到函数内部观察函数内部发生了什么:
此时我们想观察某些变量的值,我们就使用 [display] [变量名] 命令即可:
我们使用 [n] 命令就可以逐过程的调试代码。