文章目录
- [Linux 软件包管理器 yum](#Linux 软件包管理器 yum)
- [Linux 编辑器 vim](#Linux 编辑器 vim)
- [Linux 编译器 gcc/g++](#Linux 编译器 gcc/g++)
- 默认编译
- [Linux 项目自动化构建工具 make/makefile](#Linux 项目自动化构建工具 make/makefile)
- [Linux 调试工具 gdb](#Linux 调试工具 gdb)
Linux 软件包管理器 yum
什么是软件包
在Linux下安装软件有三种方式:源代码安装、rpm安装、yum安装。
源代码安装就是下载程序的源代码,并进行编译,得到可执行程序。
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包 (可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。
软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系。
yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。
关于rzsz
这个工具用于Windows机器和远端的Linux机器通过XShell传输文件。
安装完毕之后可以通过拖拽的方式将文件上传过去。
注意:关于yum的所有操作必须保证那个主机(虚拟机)网络畅通!
可以通过ping指令验证:
ping ww.baidu.com
查看软件包
通过 yum list 命令可以罗列出当前一共有哪些软件包.。由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.。例如:
yum list | grep lrzsz
结果如下:
注意:
- 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
- "x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
- "el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
- 最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.
安装软件
通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装
sudo yum install lrzsz
yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.
出现 "complete" 字样, 说明安装完成.
注意:
- 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
- yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
卸载软件
卸载命令
sudo yum remove lszrz
安装扩展源
尽管yum已经为我们准备了很多软件,但也有很多软件在yum上找不到,所以yum还有一个扩展源,是一些还没有进入yum的软件,但是以后可能会进入yum,但现阶段还不成熟。如果我们就是想要使用yum扩展源中的软件,就需要我们先下载yum扩展源,然后再按照之前的方法下载软件即可。
安装扩展源命令:
yum install -y epel-release
Linux 编辑器 vim
vim的基本概念
vim是一个多模式的编辑器,本文主要介绍最常用的三种模式:命令模式(Normal mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按ESC
键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,:
即可进入该模 式。
添加行号:set nu
去除行号:set nonu
要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes
。
三种模式的相互切换:
vim的基本操作
进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面。不过有一点要特别注意,就是在进入vim之后,是处于[命令模式],要切换到[插入模式]才能够输入文字。
[命令模式]切换至[插入模式]
输入:a
,i
,o
均可
[插入模式]切换至[命令模式]
目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下`ESC键转到[命令模式]再删除文字。当然,也可以直接删除。
[命令模式]切换至[底行模式]
shift + ;
, 其实就是输入:
退出vim
在[底行模式]下:
w:保存当前文件
wq:保存并退出vim
q:不保存退出vim
q!/wq!:强制执行操作
vim命令模式
常用指令:
指令 | 含义 |
---|---|
gg | 定位光标到最开始行 |
G | 定位光标到结尾行 |
n + G | 光标定位到任意行 |
(n)+ yy | 赋值光标所在行和其下(n - 1)行 |
(n) + p | 粘贴n重复行到光标下一行 |
(n) + dd | 剪切/删除 |
u | 撤销 |
CTRL + r | 反撤销 |
$ | 定位光标到当前行结尾 |
^ | 定位光标到当前行开始 |
w/b | 光标按单词在行内/跨行移动 |
h/j/k/l | 光标左下上右移动 |
shift + ~ | 快速大小写切换 |
(n) + r | 对光标及之后位置进行批量替换 |
(n) + x | 对光标及之后位置的字符删除 |
R | 批量替换模式(Esc退出) |
底行模式
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往后寻找到想要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往前寻找到想要的关键字为止。
Linux 编译器 gcc/g++
两种编译器的用法几乎相同,区别在于:gcc只能编译C语言,g++可以编译C语言和C++。
以下介绍以gcc为例。
默认编译
使用gcc编译代码时,需要使用指令:
gcc test.c
这样会生成一个a.out
文件,在当前目录下使用./a.out
即可执行该程序。
因为gcc编译生成的文件默认文件名为a.out
,编译后生成可执行文件,就可以使用相对路径执行该文件。
如果想为生成的文件命名,需要添加-o [文件]
选项。
预编译
编译过程分为:预编译(进行宏替换)、编译(生成汇编代码)、汇编(生成二进制文件)、链接(生成可执行文件或库文件)四个过程。
预编译的作用:
- 展开头文件
- 条件编译
- 宏替换
- 去注释
所以经过预编译后的文件仍为C语言文件。
如果想得到预编译后的文件,可以使用-E
选项。同时使用-o [文件]
选项来命名生成的文件。
gcc -E test.c -o test.i
命名预编译后的文件没有硬性的规则,不过一般我们把经过预编译后的文件命名为.i
文件。
编译
编译过程将C/C++文件转成汇编文件。
如果想得到编译后的文件,可以使用-S
选项。同时使用-o [文件]
选项来命名生成的文件。
gcc -S test.i -o test.s
我们一般将编译后的文件命名为.s
文件。
需要注意的是,我们可以对test.i
编译,也可以对test.c
编译,前者是直接编译,后者是先预编译再编译,生成的汇编文件没有区别。
汇编
汇编过程将汇编代码转换为二进制代码。
gcc -c test.s -o test.o
汇编生成的文件称为可重定位目标二进制文件,简称目标文件,在Linux下后缀一般为.o
,在Windows下后缀为.obj
。
目标文件还不能执行,要想生成一个可执行程序,还要进行最后一步:链接。
链接
目标文件和库进行链接形成可执行程序。
库(库文件):提供给我们方法的实现,如printf
等。
C语言的标准库,本质就是一个文件,有自己的路径。
动态库和静态库
Linux下动态库后缀为.so
,静态库后缀为.a
,库的命名规则为libname.so.xxx
,其中name
是区分不同库文件的部分,其余部分相同。
Windows下动态库后缀为.dll
,静态库后缀为.lib
。
链接分为动态链接和静态链接,动态链接用到的库称为动态库,静态链接用到的库称为静态库。
Linux下动态库的路径:/lib64/libc.so
,静态库的路径:/lib64/libc.a
。
静态链接时,在程序运行的过程中会到动态库中查找所需方法,所以动态库不能缺失,缺失后不致影响一个程序,很多程序都无法正常运行;在编译器使用静态库进行静态链接时,将自己的方法拷贝到目标程序中,该程序以后不再依赖库。
在Linux中,编译形成的可执行程序,默认采用动态链接,如果要按照静态链接的方式进行编译,需要加-static
选项。
如果没有静态库,使用-static
会报错。
如果没有动态库,有静态库,而且编译器能找到,也可以编译。
-static
的本质:改变优先级,且只适配一次,即一旦声明-static
,就不会再使用动态库。
查看文件链接的库以及链接方式的指令:flie [文件]
动态链接和静态链接的对比
动态库时共享库,有效的节省资源(磁盘空间,内存空间,网络空间)。但动态库一旦缺失,各个程序都无法正常运行。
静态库不依赖库,程序可以独立运行,但程序体积大,比较消耗资源。
Linux 项目自动化构建工具 make/makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
例如当我们写出一个C语言文件test.c
C
#include <stdio.h>
int main()
{
printf("Hello Linux\n");
return 0;
}
我们可以在同一目录下创建一个makefile文件,并在其中写
test:test.c
gcc -o test test.c
.PHONY:clean
clean:
rm -f test
其中第一行和第五行叫做依赖关系,第二行和第六行叫做依赖方法。
make是否执行:比较可执行程序的最近修改时间和源文件的最近修改时间,如果.exe
新于.c
,则不执行make,如果.exe
老于.c
,则执行make。
而.PHONY:[文件]
可以使该文件忽略时间,总是被执行。
使用make时,后面要加指令,如:make clean
,如果不加指令,默认执行makefile中的第一条指令。
Linux 调试工具 gdb
debug和release
在Linux下,编译生成的可执行程序默认是release
版本,无debug
信息,想要生成debug
版本的可执行程序,需要在编译时加-g
选项。
readelf:可以读取可执行程序文件的指令。
readelf -S [文件] | grep -i debug
可以查看文件中有没有debug
信息。
gdb指令
指令 | 含义 |
---|---|
l [行号/函数名] | 查看代码 |
r | 启动程序(到断点停下) |
b [行号/函数名] | 打断点 |
info b | 查看断点 |
d [断点编号] | 取消断点 |
n | 逐过程调试 |
s | 逐语句调试 |
p [变量] | 查看变量值 |
display [编号] | 常显示变量值 |
undisplay | 取消常显示 |
until [行号] | 跳转至x行 |
finish | 直接结束当前函数 |
c | 运行到下一个断点 |
disable [编号] | 关闭断点 |
enable [编号] | 打开断点 |