Linux(4)—— 基础开发工具
目录
yum安装
什么是软件包?
rzsz
查看软件包
卸载
vim编辑器
模式切换
1、命令模式
2、插入模式
3、底行模式
命令模式指令
代码编译
预处理
常用写法
编译过程
-E(预处理)
-S(编译)
-c(汇编)
链接
Linux项目自动化构建工具 —— -make/Makefile
创建项目
清理项目
建立编译
本次文章介绍Linux中的一些基础开发工具;包括yum软件包,vim编辑器,gcc/g++编译器,Linux项目自动化构建工具。
yum安装
yum是一个Linux的软件包管理器,简单来说就类似于我们下载软件时使用的应用商店。
什么是软件包?
在Linux下安装软件,通常会下载到程序的源代码并进行编译,得到一个可执行程序。但是对于用户来说,这样的操作比较麻烦,所以就诞生出了一个更简便的办法 —— 软件包。有人将一些常用的软件提前编译好,做成软件包,直接安装后就可以进行使用。
软件包和软件包管理器,我们可以理解为App和应用商店的关系。yum就是这样一个软件包管理器。
我们可以使用下面的指令来查看yum的存放路径:
which yum

rzsz
这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去。
通过这个软件,我们可以实现window和Linux系统的文件互传。下面我们通过yum安装这个软件。
查看软件包
通过 yum list 命令可以罗列出当前一共有哪些软件包。
yum list
上面的指令表示全部检索,可能会花费很多时间;如果我们想要查找其中某一个包,可以使用grep来进行筛选。例如我们查找上面的rzsz的包:
yum list | grep lrzsz

我们复制包的名称,使用install安装:
yum install lrzsz.x86_64
卸载
下载软件使用下面的命令:
yum remove [软件包名]
vim编辑器
vim编辑器用于文本编写,也可以使用vim来书写代码。vim是一个多模式的编辑器,包括插入模式、命令模式和底行模式。
模式切换
下面我们创建一个c程序文件来学习vim编辑器。
vim test.c
使用该命令来打开一个名为test.c的c程序文件。
1、命令模式
输入上面的指令后就会来到vim的命令模式。命令模式可以理解为vim的默认模式,使用vim打开文件后就会进入命令模式的界面:

我们发现这时按键盘可能没有反应。因为这是用户所有的输入都会被当做命令,一般是不会有文本输入的。
那么我们怎么编写文件呢?这时就需要切换到插入模式。输入键盘上的 i 键即可切换。
2、插入模式
输入i键后我们可以看到左下角变成了INSERT字样,这时就表示切换到了插入模式。

这时我们就可以编写文件了。例如我们写一段简单的c语言代码,打印“Hello Linux!”:

下面我们需要对刚刚写的文件进行保存后退出。这时需要回退至命令模式;按下键盘上的 esc 键即可回退。回退后需要从命令模式进入底行模式:
3、底行模式
按下键盘的 shift + :键后输入 wq 即可退出vim编辑器。

shift+:可以进入底行模式;wq的作用可以理解为保存并退出。
如果想从底行模式又退回命令模式,则按 esc 键即可。
【注意】不能并且不要试图从插入模式直接切换到底行模式
命令模式指令
- gg:定位光标到最开始行
- shift + g:定位光标到结尾行
- n + shift + g:定位光标到任意行;n表示行数
- yy + (n) + p:复制光标所在行并粘贴到下一行;n表示复制的次数,例如yy100p表示复制当前行100个并从下一行开始粘贴
- (n)+ yy:复制当前行开始的n行
- dd +(n)+ p:dd剪切当前行后使用p粘贴到光标位置
- dd:删除
- u:撤销
- shift + $:定位光标到当前行结尾
- shift + ^:定位光标到当前行开头
- w,b:光标按照单词进行行内跨行移动
- h,j,k,l:左、下、上、右移动
- shift + ~:大小写转化
代码编译
代码书写后需要编译才能执行。这里我们介绍gcc和g++编译器。其中,gcc适合c语言编译,g++适合C++编译。
如果我有一个名为test.c的c程序文件,直接使用gcc尅生成一个编译后的可执行程序。
gcc test.c
执行该命令后会在当前文件夹下默认生成一个 a.out 的可执行程序。最后我们想要运行该程序直接输入命令:
./a.out
就可以运行该程序文件。
g++的使用方法与gcc相同。这里我们需要注意的是,gcc只能编译c语言,如果需要编译C++程序,则g++才能完成编译。
编译流程为:
预处理 ——> 编译 ——> 汇编 ——> 链接
预处理
一般预处理的过程包括:
- 去注释(将源文件的注释行代码去掉)
- 头文件展开(将头文件的内容拷贝到文件中)
- 条件编译
- 宏替换(简单替换)
编译器(如gcc)有直接修改代码的能力。我们如果做一些简单的修改,不用使用vim等工具去文件修改内容,可以直接在gcc的命令行加上修改选项即可。
常用写法
使用的比较多的一个gcc编译写法为:
gcc [文件名] -o [命名]
-o表示生成一个自定义命名的可执行程序文件;将我们自己明明的文件名称放在-o选项之后即可。这是后面我们常用的一个编译方式。
编译过程
-E(预处理)
在上面的常用书写方式的基础上,我们需要通过编译流程来完整处理文件。首先我们可以如下加入-E选项进行预处理:
gcc -E [文件名] -o [命名]
![]()
我们要求(建议)使用-E选项后给文件命名带 .i 后缀。
选项-E的作用简单来说就是告诉gcc编译器从现在开始进行程序的翻译,将预处理工作做完就停下来,不再往后走。
-S(编译)
预处理之后是汇编,需要用到-S选项:
![]()
我们要求(建议)使用-S选项后给文件命名带 .s 后缀。
-S的作用是从现在开始进行程序的翻译,将翻译工作做完后停下来,不再往后走。
-c(汇编)
这一步的作用是将文件翻译成机器能识别的二进制文件。
![]()
我们要求(建议)使用-c选项后给文件命名带 .o 后缀。
-c的作用是从现在开始进行程序的翻译,价格汇编工作做完后停下来,不再往后走。
而我们定义的 mycode.o 文件是 可重定位目标二进制文件,简称目标文件。该目标文件虽然是二进制文件,但不能够独立执行。想要执行文件,还需要进行链接操作。
链接
![]()
这一步的作用是将可重定位目标二进制文件,和库进行链接形成可执行程序。
如果记不住这些选项流程,可以看一下键盘左上角的esc键,对应-E、-S、-c选项,再加一个链接操作就能完成编译了。
链接有动态链接和静态链接两种形式;在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不用再依赖静态库;而动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致多个程序都无法进行正常运行。
在Linux中,编译形成可执行程序,默认采用的就是动态链接(提供动态库)
在上面的代码操作中我们使用的就是动态链接的方式。如果我们要在Linux中使用静态链接,则需要使用如下的命令:
![]()
静态链接后的文件体积会远远大于动态链的程序。在Linux中如果需要按照静态链接的方式形成可执行程序,则需要添加-static选项。
安装c语言静态库的命令如下:(需要root权限)
yum install -y glibc-static
Linux项目自动化构建工具 —— -make/Makefile
先简单介绍一下:make是一条指令;makefile是一个当前目录下的文件。
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
创建项目
那么这两个到底是什么东西呢?我们上手来了解一下。使用下面的指令在当前目录下创建一个文件:
touch Makefile
也可以取名为 makefile 小写形式。这里还是建议使用大写。
然后时候用vim打开Makefile文件:
vim Makefile
在后面的操作中我们需要使用到之前写的test.c文件。就是一个简单的打印文件:
#include <stdio.h>int main()
{printf("Hello Linux!\n");return 0;
}
在Makefile文件中书写下面的内容:
test.exe:test.cgcc -o test.exe test.c
其中第二行开头不是空格,而是按 tab 键;第一行表示依赖关系,第二行表示依赖方法。
然后保存并退出。完成操作。
刚刚的操作的作用是,以后要编译该文件就不用再手动写gcc命令,而是直接输入 make 命令,系统就会直接找到刚刚我们指定的文件,然后进行编译操作。

清理项目
除了上面我们创建了一个项目,我们还需要对项目进行清理(删除);我们可以使用前面学到的rm指令,但是该指令使用后无法撤销删除操作,风险太大,因此我们这里介绍另外一种使用makefile来清理项目的方法。
再次使用vim打开makefile文件。使用clean来自定义清理项目的指令:

所以下次要清理项目直接输入指令:
make clean

建立编译
下面我们利用makefile完成编译的步骤。

这里我们发现书写的顺序是反着来的,因为依赖关系是层层递进的,可以理解为根据结果推过程。下面我们make一下:

可以看到执行的顺序又从下往上进行了。
因为makefile在扫描文件时会根据依赖关系依次进行。最开始执行mycode.o的操作时,系统会发现没有mycode.o这个文件,于是会跳转到下一条依赖关系进行;如此类推,层层推进,最后就出现了上图的执行顺序。
我们在使用make指令时,会看到系统回显的依赖方法的执行记录。如果我们不想看到回显的内容,可以在依赖方法前加上@,这样就不会进行回显了。

再次执行make指令,会发现没有回显。

