【LInux】基础开发工具的使用

简介: 一. Linux的应用市场 — yum1. 什么是yum?人们把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

一. Linux的应用市场 — yum


1. 什么是yum?


人们把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安

装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

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


2. 为什么要有yum?


给开发者提供一个安全、高效的软件安装环境。


3. 如何使用yum?


3.1 前提条件


关于 yum 的所有操作必须保证主机(虚拟机)处于联网状态。就行我们在手机上下载软件,需要连WIFE或开流量一样。

我们可以通过ping指令来验证我们的机器是否处于联网状态,具体的操作就是ping + 网址,如果一直有刷新time = xxxms说明已经处于联网状态。

image.png


3.2 搜索软件


就好比我们在手机的应用市场里搜索我们想要下载的App一样

image.png

在Linux中,我们也可以通过yum list | grep | 软件包关键字这个指令来搜索yum里包含该关键字的软件包。

比如我们要下载一个软件叫 lrzsz ,可以在linux中可以代替ftp的上传和下载。

image.png

几点说明:

  • “x86_64” 后缀表示64位系统的安装包,选择包时要和系统匹配
  • “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6
  • 最后一列, os 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “App Store” 这样的概念。


3.3 安装软件


通过前面的搜索我们可以得到想要下载的软件包的名称,复制软件包的名称,然后我们可以输入yum install 软件包名称指令来完成软件的安装

image.png

最后出现 “complete” 字样, 说明安装完成。

几点说明:

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成,安装后的软件所以用户都可以使用。
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错。


3.4 卸载软件


直接输入指令yum remove 软件包名称,当然也需要 sudo 或者切到 root 账户下才能完成。

image.png


二. Linux的文本编辑器 — vim


1. 什么是vim?


vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。

vim(vi improved)是vi编辑器的加强版,它不仅兼容vi的所有指令,而且还有一些新的特性在里面,例如语法加亮、自动缩进等。


2. 为什么要学习vim?


很强大的编辑功能,不逊色于任何最新的文本编辑器。

vi编辑器是所有Unix及Linux系统下标准的编辑器,所有的Unix Like系统都会内建vi文本编辑器,其他的文本编辑器则不一定会存在

一些软件的编辑接口会主动调用vi (例如 crontab, visudo, edquota 等命令)


3. 如何使用vim?


3.1 启用vim


指令:

vim 文件名,进入后默认光标是在上一次退出编辑时的位置

vim 文件名 + n,进入后光标位置在第n行


3.2 退出vim


命令模式下退出

在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则vim保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则vim直接退出, 返回到shell。

底行模式下退出

:w 保存但不退出

:q 退出但不保存

:wq 保存且退出

:!wq 强制保存且退出


3.3 简单配置vim


原生的vim界面是比较简陋的,不仅如此编程的体验也很不好,没有换行后自动缩进、tab距离太短、没有自动补齐等问题,这些都可以通过配置自己来解决。

image.png

配置文件的位置

在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。

而在每个用户的主工作目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”,这个文件通常不存在,需要我们自己建立。注意这里的配置只针对当前用户有效。

配置操作

下面我们简单讲解一下只针对当前用户有效的vim的配置方法

第一步:

在当前用户的主工作目录下创建".vimrc"这个文件,如果有的话就不用创建了。

终端操作:

$ cd ~ //回到主工作目录

$ touch .vimrc //创建文件

第二步:

进入 .vimrc 文件,写入我们需要的配置选项。常见配置选项比如下面几个:

  • 显示行号: set nu
  • 设置语法高亮: syntax on
  • 设置缩进的空格数为4: set shiftwidth=4

终端操作:

$ vim .vimrc //进入文件

image.png

保存并退出,再次进入这个文件我们发现确实配置成功了

image.png


3.4 vim常见的几种模式


主要介绍几种常见的模式:正常模式、插入模式、命令模式、视图模式


3.4.1 正常模式


正常模式是vim打开文件后默认进入的模式,无论在哪种模式下,按下Esc键就会进入正常模式。如果我们在使用其他各种模式时出现混乱,无脑Esc进入正常模式就行。

image.png

正常模式的作用

正常模式不能编辑文本。它一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一般的键/键组合会被当成功能键,而不会键入对应的字符。

在这个模式下,我们可能通过键盘在文本中跳来跳去,跳动的范围从小到大是字符、单词、行、句子、段落和屏幕。

正常模式下管理文本的常用快捷键

shift + $:定位到当前行的最后一个字符位置

shift + ^:定位到当前行的第一个字符的位置

gg:定位到代码第一行位置

shift + g:定位到代码最后一行的位置

u / ctrl+r:撤销 / 反撤销

yy / p:复制一行 / 粘贴一行

n+yy / n+p:复制n行 / 粘贴n行

dd / n+dd:删除一行 / 删除n行

shift + ~:从光标位置开始逐个字符地从左往右进行大小写切换

w / b:以“单词”为单位进行光标的跳转

ctrl + b:文本向上移动一页

ctrl + f:文本向下移动一页

ctrl + u:文本向上移动半页

ctrl + d:文本向下移动半页


3.4.2 插入模式


在正常模式下按下a、i、o 键,进入插入模式,插入模式里可以进行文字的输入,在该模式下按Esc键可以切换回正常模式。

当我们处于正常模式时,按下:

  • a :在光标的下一个位置进入插入模式
  • i :在光标当前位置进入插入模式
  • o :往下开辟一空行进入插入模式
  • image.png

插入模式的作用

插入模式中,击键时会写入相应的字符。

插入模式下快速编辑

插入模式没有快捷键,需要配合命令模式下的那些快捷键进行文本编辑,可以达到快速编辑的作用。


3.4.3 底行/命令模式


在正常模式下输入“:”进入命令模式

在命令模式中按Esc进入正常模式

image.png

命令模式的作用

在命令模式中可以执行一些输入并执行一些vim或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。

命令模式的下的常用快捷键

set mouse=a / mouse-=a:打开鼠标 / 关闭鼠标

set nu / nonu:设置行号 / 取消行号

w:保存

q:退出

wq:保存并退出

! + wq:强制保存并退出

vs + 文件名:多文件分屏编辑(补充:在正常模式下按ctrl + ww可以进行文件切换)

↑ / ↓:搜索历史命令


3.4.4 视图模式


在正常模式按下ctrl+v,即可以进入视图模式。在视图模式中我们可以选中一块区域进行操作包括:删除、注释、缩进等。

image.png视图模式下各功能的具体操作方法

注意在视图模式里,只能通过h(左)、j(下)、k(上)、l(右)来移动光标。

功能一:批量注释

在正常模式里先把光标移动到要注释的起始地方,然后ctrl + v进入视图模式。

接下来通过h、j、k、l 来选中所有要注释的行。

接着我们按shift + i(即大写字母的i)进入插入模式之后,输入我们的注释符’#‘或者’//’,接着迅速按下Esc键即可完成批量注释,并回到正常模式。

功能二:删除批量注释

正常模式下按ctrl + v进入视图模式

接着我们一样通过h、j、k、l 选择我们刚刚插入的注释符 ‘//’,注意我们必须将两列注释符全部选择到。

接着按d直接删除并回到正常模式

功能三:批量缩进(即批量tab)

在正常模式里先把光标移动到要批量缩进行的开始的地方,然后ctrl + v进入视图模式。

接下来通过h、j、k、l 来选中要缩进的行。

shift+ i 进入插入模式后,按tab建然后迅速按Esc完成批量缩进并回到正常模式

功能四:批量反缩进(即shift + tab)

按住ctrl + v 进入可视块模式

通过h、j、k、l 来批量选择我们要删除的空格

最后按d直接删除,并回到正常模式


3.4.5 各个模式的相互切换


正常模式是其他模式的中转站,其他模式只需按Esc就可以进入正常模式,再经由正常模式转到其他模式,如下图所示:image.png


三. Linux的编译器 — gcc / g++


这里我们看看gcc如何把一个hello.c的源程序最终编译成一个可执行程序hello的。

image.png


1. 预处理


$ gcc -o hello.i -E hello.c

image.png


预处理阶段主要完成:头文件展开、宏替换、条件编译和去掉注释

选项“-o”后面跟的是经过预处理后生成的目标文件,里面存有预处理后的信息。

选项“-E”作用是仅让gcc完成预处理的过程,后面跟的是依赖文件

如果不写明生成的目标文件(即 -o hello.i ),那么“-E”选项执行的预处理操作就会把源程序经过预处理后得到的信息输出到显示器上;如果写明目标文件,就会把这些信息存储到指定的目标文件当中。

image.png

2. 编译


$ gcc -o hello.s -S hello.i

image.png

编译主要完成:检查语法错误和生成汇编代码

选项“-E”完成编译的过程,如果依赖文件是还未被预处理的源文件,那么会先完成预处理再完成编译,如果已经完成了预处理,就直接进行编译。

如果不写明生成的目标文件,会默认生成同名且后缀为.s的目标文件,里面写有该程序的汇编代码。

image.png


3. 汇编


$ g++ -o hello.c -c hello.s

image.png

汇编主要完成:把汇编代码转化成二进制机器码

选项“-c”完成汇编的过程,如果依赖文件还未完成预处理或编译,会先完成前面的最后完成汇编。

如果不写明生成的目标文件,会默认生成同名且后缀为.o的目标文件,里面写有该程序的二进制机器码。

image.png


4. 连接


$ gcc hello.o

连接生成最终的可执行程序

不用加任何选项就是直接完成从预处理到最后的连接过程

如果是多文件编译,在连接这步时要把需要连接的文件都一起写在后面,中间用空格隔开。

如果不写明目标文件,默认生成一个叫做a.out的可执行程序

image.png


5. 动态库和静态库


5.1 什么是库?


库是写好的现有的,成熟的,可以复用的代码。又因为连接的方式不同分为静态库和动态库。


5.2 静态库


什么是静态库?

在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,这种连接方式叫做静态连接,被打包的库叫静态库。

静态库的优缺点

优点

编译连接成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容。

缺点

可执行程序的文件较大

库更新时,需要重新编译链接


5.2 动态库


什么是动态库?

链接成功后的可执行程序会保留一个指向库的位置,在程序运行时才会去读取库函数来使用。这种连接库的方式叫做动态链接,被连接的库叫做动态库。

动态库的优缺点

优点:

可执行程序的文件小,规避了空间浪费问题

实时连接最新的库

缺点:

可执行文件无法单独运行,必须保证能够连接到动态库。


5.3 Linux下的连接方式


gcc / g++默认可执行程序,默认是动态链接的。如果想要静态连接,需要我们在连接时手动加上选项 -static。

我们有两种方法证明gcc / g++默认生成的可执行程序是动态链接的,在此之前我们先创建几个文件,看下面例子:

我们有个叫做mytest.c的文件

image.png

通过gcc编译连接mytest.c生成可执行程序mytest,注意我们没有加任何其他选项,mytest这个可执行程序是gcc默认情况下生成的。

image.png

接着我们在通过 -static 选项编译链接mytest.c,生成一个静态连接的可执行程序mytest_s

image.png

先阶段我们可以直接地看到:静态连接生成的mytest_s的文件大小是mytest的100倍多一点。可以推测默认编译连接形成的mytest很可能是动态链接的。

我们可以通过两条指令file和ldd来具体的查看它们的连接方式和库。

指令一:file + 可执行程序名称

file指令用来识别文件类型,也可用来辨别一些文件的编码格式。

通过file目录指令分别查看这两个可执行程序,明确写着mytest是动态链接的,mytest_s是静态链接的。

image.png

指令二:ldd + 可执行程序名称

ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系,这也就是该指令的作用。

补充几点:Linux中动态库的扩展名通常为 libxxx.a ,而静态库的为 libxxx.so 差别就是后缀不同,动态库后缀为 .so ,静态库后缀为 .a

回到我们的例子我们只想 ldd + mytest,结果我们可以找到它动态库的名称是 c ,即mytest是动态链接的。

image.png

看看静态链接生成的mytest_s,执行 ldd mytest_s

image.png

结果告诉我们他不是动态链接的可执行程序。综上我们可以得到最终的结论,gcc / g++默认生成的可执行程序时动态链接的,想要静态链接,需要我们在连接时手动加入 -static 选项。


四. Linux的调试工具 — gdb


1. 检查调试信息


1.1 生成debug模式的程序


程序的发布方式有两种,debug模式和release模式,Linux中gcc / g++编译链接生成的二进制程序,默认是release模式,此时是没有调试信息的。要使用gdb调试,必须要有调试信息即debug模式,只需在编译的时候, 加上 -g 选项。


1.2 检查是否带有调试信息


方法一:直接对程序进行gdb调试

直接对该可执行程序进行调试,执行 gdb + 程序名称 开始调试,如果没有调试信息它会告诉你:(no debugging symbols found)。

image.png

如果有调试信息的话就不会出现括号里的话(no debugging symbols found)

image.png

方法二:通过readelf指令查看调试信息

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件、动态库(.so)、静态库(.a) 等包含ELF格式的文件。其中选项 -S作用是显示节头信息(如果有数据的话)。

指令:readelf -S 可执行程序名称 | grep debug

对于没有调试信息的可执行程序,不会打印出任何东西

image.png

如果有调试信息,它会筛选打印出来

image.png


2. 开始调试和退出调试


开始:gdb + 可执行程序名称

退出:quit 或 ctrl + d


3. 具体操作方法


gdb有记忆功能,什么都不用输入,按回车自动自行上一条指令,上下方向键可以查看之前输入过的指令。

l + 行号:列出代码,一次列10行

r:运行代码

b + 行号:在指定行上打断点

d + 断点编号:删除断点,不指定断点编号的话就是删除所有断点

info + b:查看所有断点信息

c:跳转到下一个断点

n:逐语句

s:逐过程

p + 变量名:查看变量的值

display + 变量名:踪查看一个变量,每次停下来都显示它的值

undisplay + 变量编号:取消对先前设置的那些变量的跟踪

until + 行号:跳转到任意行

finish:直接运行完当前所在的函数


五. Linux的项目自动化构建工具 — make/Makefile


1. 什么是make和Makefile?


Makefile是一个文件,里面写我们编译的指令。

make是一条命令,用来执行Makefile里的编译指令。


2. 为什么要有make和Makefile?


如果遇到更多的源文件需要编译和共同连接时,运行的话用gcc就要把所有的源文件的名字写在一起,其中一个写错了,检查起来会很麻烦。我们可以把编译的指令存到Makefile文件里统一管理,通过make来执行编译操作,达到一键编译运行效果,极大的提高了软件开发的效率。


2. Makefile的使用


比如我们这里来实现一个简单的进度条功能,创建三个文件:proc.h、main.c、proc.c和Makefile

image.png

Makefile

我们先写好Makefile文件的内容,确保各个文件都能顺利完成编译和最后的连接。

依赖关系

以冒号分隔,左边是目标文件,右边是生成目标文件所需要的依赖文件

image.png

依赖方法

依赖方法是写在对应依赖关系下面的具体操作方法

依赖方法必须以tab开头,不能通过空格一个个的打!

image.png

执行的顺序

下面是我们进度条Makefileli的内容,整体是从上往下执行,先看依赖关系中的依赖文件是否存在,如果存在就执行对应的依赖方法;不存在的话就跳过依赖方法往下找生成依赖文件的依赖关系和依赖方法,生成前面指令想要的依赖文件,生成后再这回来执行指令。

PS:这里连接时可以不写明proc.h这个头文件,只要proc.c或main.c只要包含了它,系统就会自动到当前目录下找这个我们自己写的头文件来连接的。

image.png

这时我们只要输入命令make就可以完成整个进度条程序的编译工作了。可以看到这里的执行顺序:先执行编译指令,得到编译好的文件后执行连接指令。

image.png

伪目标完成项目的清理工作

我们还可以在Makefile中实现一个用来清理生成的目标文件和可执行程序的命令,以便对源程序代码修改后可以快速清理和重编译,一般我们把这种命令设置为伪目标,用 .PHONY 修饰。


我们给目标文件取名为clean,不需要依赖文件,因为我们的主要目的是执行下面的依赖方法。像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

image.png

伪目标的特性.


伪目标的特性是总是被执行的,即随时都可以被执行,即使没有对应的文件。

image.png

而真目标执行一次后如果你再次执行,它会提示你这已经是最新的了。

image.png

那么我们最终整合伪目标后看看Makefile的文件内容:

image.png

Makefile中的宏定义

$():替换成括号里面的内容

$@ :依赖关系中的目标文件

$^ :依赖关系中的依赖文件列表

$< :分别取出依赖关系中的一个个依赖文件,执行相同的指令

宏替换可以使得程序更加灵活和简洁,把具体的文件名取别名替换,这样修改时只需要别名的内容就行。

image.png

具体进度条的实现

proc.h

包含需要的头文件和定义一个宏定义NUM表示进度条字符的数量

image.png

main.c

在main函数里调用proc()函数

image.png

proc.c

具体进度条的实现,用"#"模拟加载的过程,最右边是代表加载程度的百分比和一个循环转动的线条。

要注意的是printf函数是行缓冲函数,满足下面条件之一才会将缓冲区刷到对应的文件(一般是stdout即显示器)中。

  • 缓冲区被填满
  • 写入的字符中有’\n’或’\r’
  • 调用fflush手动刷新
  • 程序结束

观察我们下图的程序,printf本来要输出到显示器上的内容一直被存放在缓冲区里,不满足我们的连续加载效果的要求,所以我们要调用fflush手动刷新缓冲区。

image.png

每进入一次循环就刷新一次缓冲区,使得前面printf的内容输出到显示器

image.png


3. make的工作原理


make是如何工作的,在默认的方式下,也就是我们只输入make命令

  1. make会在当前目录下找名字叫“Makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“proc”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果proc文件不存在,或是proc所依赖的后面的 proc.o和main.o 文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么他就会执行后面所定义的命令来生成 proc.o和main.o 这个文件。
  4. 如果proc所依赖的 proc.o和main.o 文件不存在,那么make会在当前文件中找目标为 proc,o和main.o 文件的依赖性,如果找到则再根据那一个规则生成 proc,o和main.o 文件。
  5. 当然,你的 proc.c和main.c 文件是存在的,于是make会生成对应的 .o文件,然后再用 proc,o和main.o 文件执行make的终极任务,也就是生成可执行文件proc
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
9月前
|
NoSQL Linux 测试技术
Linux开发工具——gdb篇
Linux开发工具——gdb篇
|
9月前
|
存储 Linux 开发工具
Linux开发工具——gcc篇
Linux开发工具——gcc篇
|
9月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
8月前
|
Linux 开发工具 数据安全/隐私保护
Linux基础——Linux开发工具(下)_make/makefile
Linux基础——Linux开发工具(下)_make/makefile
64 1
|
7月前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
8月前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
58 0
|
8月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
43 0
|
8月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
55 0
|
8月前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
33 0
|
8月前
|
Linux Shell 开发工具
【Linux】Linux环境基础开发工具_2
【Linux】Linux环境基础开发工具_2
32 0