目录
五、Linux项目自动化构建工具--make/makefile
一、Linux 软件包管理器yum
1、什么是软件包
CentOS使用yum(Yellowdog Updater, Modified)作为其包管理系统,而Ubuntu使用apt(Advanced Package Tool)作为其包管理系统,本文只对yum进行讲解。
2、yum的使用
a. 查看软件包:yum list
可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们可以配合使用 grep 命令筛选出我们需要的包。例如我们来查找一下gcc 或者 lrzsz的包:
注意事项:软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构."x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配。"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7.最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念。
b. 安装 yum install
注意事项:
安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成yum安装软件只能一个装完了再装另一个。正在yum安装一个软件的过程中, 如果再尝试用yum安装另外 一个软件, yum会报错.
c. 卸载:yum remove
二、Linux编辑器--vim
1、vim基本概念
vim有许多模式,这里我们只介绍最常使用的三种:
(1)、正常 / 普通 / 命令模式(Normal mode):控制屏幕光标的移动,字符,字或者行的删除,移动复制某区段以及进入插入模式,底行模式下。
(2)、插入模式(Insert mode):只有在插入模式下,才可以做文字输入,按ESC键位可以回到正常模式。
(3)、底行模式(last line mode):文件保存或者退出,也可以进行文件替换,查找字符串,列出行号等等一系列操作。在命令模式下,按 shift+:即可进入底行模式。
(4)、要查看所有模式:打开vim,底行模式直接输入: help vim-modes
2、vim的基本操作
a. 进入vim
在系统提示符号输入 vim+文件名称后,就可以进入vim的编辑页面,进入vim后处于正常模式,需要我们切换到插入模式才能够输入文字。
那么正常模式如何切换到插入模式呢?
b. 正常模式切换到插入模式
按 'a' : 将插入点移动到当前光标所在字符的右侧,然后进入插入模式,适用于在当前字符之后插入文本。
按 'i' : 将插入点移动到当前光标所在的位置,进入插入模式,适用于在当前光标处插入文本。
按 'o' : 在当前光标的下一行处创建一个新行,并将插入点移动到该新行的开始处,适用于在下一行开始的位置输入文本。
c. 插入模式切换到正常模式
这个很简单我们只需要按一下键盘的ESC键位,就可以切换到命令模式了。
d. 正常模式插入到底行模式
按住 shift+; 其实就是 ' : ' 就可以进入底行模式。
e. 退出vim以及保存文件
在正常模式下按住 shift+;进入底行模式,然后输入w(保存当前文件),wq(保存文件并退出),
q!(不保存强制退出),w!(强制保存)。
3、vim 正常模式常用命令集
shift+$ | 光标定位在当前行的最右侧结尾处 | n+yy | 复制当前行 / 多行 |
shift+^ | 光标定位在当前行的最左侧结尾处 | n+p | 在下一行进行粘贴/可以多次粘贴 |
shift+g | 光标定位到文本的最后一行 | u | 撤销编辑操作 |
n+shift+g | 光标定位到文本的第n行 | ctrl+r | 对撤销进行撤销 |
gg | 光标定位到文本的最开始 | n+dd | 删除当前行 / 多行 |
h | 左移 | shift+` =~ | 大小写快速切换 |
j | 下移 | n+r | 替换当前光标所在的字符 |
k | 上移 | shift+r =R | 替换模式 |
i | 右移 | n+x | 删除光标所在字符 向右侧进行局部删除 |
w | 按照"单词"在行内进行移动,后移 光标跳到下个单词的开头
|
n+shift+x =X | 向左侧进行局部删除 |
b | 按照"单词"在行内进行移动,前移 光标跳到上一个单词的开始 |
shift+3 =# | 高亮查找的函数名 |
e | 按照"单词"在行内进行移动,后移 光标跳到下个单词的结尾
|
n | 下一个查找到的函数/字符串名 |
4、vim 底行模式常用命令集
: set nu | 列出行号 | : q/q! | 退出/强制退出 |
: # | #表示一个数字,在冒号后输入一个数字再回车就会跳到该行 | : wq/wq! | 保存并退出/强制保存并退出 |
: /+字符 | 从光标所在地,向下滚动搜索字符 可以按 n 会往后寻找到您要的关键字为止 |
: !+命令 | 不退出vim执行shell命令 |
: ?+字符 | 从光标所在地,向上滚动搜索字符 可以按 n 会往前寻找到您要的关键字为止 |
: vs +文件名 | 分屏打开某个文件,如果该文件在其他目录则需要加上路径 |
:w/w! | 保存/强制保存 | ctrl + ww | 光标多终端切换 |
5、vim中批量化注释和取消注释
a. 批量化注释:
第一步:ctrl+v 第二步:hjkl 进行区域选择 第三步:shift+i 第四步:// 第五步:esc
b. 批量化去注释:
第一步:ctrl+v 第二步:hjkl 进行区域选择 第三步:d
6、vim配置方法
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
而在每个用户主目录下,都可以自己建立私有的配置文件,可以命名为" .vimrc "。
在个人用户下配置vim:
首先我们要进入自己的家目录:cd ~ (pwd查看一下)
然后先touch .vimrc 再打开vim .vimrc,此时就可以在.vimrc中进行相关配置了
三、Linux编译器--gcc/g++
1、gcc工作步骤
a. 预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是指以#号开头的代码行。
例如:gcc -E test.c -o test.i
选项:"-E" 作用是从现在开始进行程序翻译过程,当预处理完成时就停下来。选项:"-o" 时指定目标文件;".i" 是预处理后的代码文件。
b. 编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
例如:gcc -S test.i -o test.s
选项:"-S" 作用是从现在开始进行程序翻译,当编译工作做完就停下来,只进行编译而不进行汇编,生成汇编代码。".s" 是汇编语言代码的文件。
c. 汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的".s" 文件转成目标文件,"-c" 选项的作用是从现在开始进行程序翻译 ,当汇编工作做完就停下来,我们可以通过"-c"就可以看到汇编代码已转换为".o" 的二进制目标代码。
例如:gcc -c test.s -o test.o
d. 链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
例如:gcc test.o -o test
2、补充:函数库
a. 函数库的引入

对于上面生成的可执行文件test,我们可以通过 ldd test 来查看可执行程序依赖的库。
b. 函数库的分类
函数库分为动态库和静态库两种。
静态库:静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀一般为".a"。
动态库:动态库是指在编译链接时并没有把库文件的代码加入到可执行文件中,而是在执行程序时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀为".so", 如上面所说 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。
gcc默认生成的二进制程序,是动态链接的,可以通过file命令或ldd来查看。
C/C++ (yum安装静态库):
sudo yum install -y glibc-static libstdc++-static
那么gcc如何链接动静态库呢?
我们来查看一下,是不是分别链接了动态库和静态库:
3、gcc相关选项
-E | 只激活预处理,不生成文件,需要把它重定向到一个输入文件里面 | -g | 生成调试信息,GUN调试器可以利用该信息 |
-S | 编译到汇编语言不进行汇编和链接 | -shared | 这个选项将尽量使用动态库,所以生成文件比较小,但是需要有系统动态库 |
-c | 编译到目标代码 | -w | 不生成任何警告信息 |
-o | 文件输出到 文件 | -Walll | 生成所有警告信息 |
-static | 采用静态链接 | -O0,-O1, -O2,-O3 |
编译器的优化选项的4个级别, -O0表示没有优化,-O3优化级别最高 |
四、Linux调试器--gdb
1、引入
程序的发布方式有两种,dubug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项。
2、gdb常用选项
l(list)+行号 | 显示指定行之后的代码 | disable+编号 | 关闭断点 |
l(list)+函数名 | 列出某个函数源代码 | enable+编号 | 启用断点 |
r(run) | 运行程序 | n(next) | 逐过程 |
b(break)+行号 | 在指定行打断点 | s(step) | 逐语句 |
b(break)+函数名 | 在指定函数打断点 | p | 显示变量内容或地址(只显示一次就会消失)例如:p i,p &i |
b(break)+文件名+行号或函数名 | 在指定文件的指定行/指定函数打断点 | display | 常显示变量的内容或地址 例如:display i,display &i |
info b(break) | 查看断点信息 | undisplay | 取消常显示 |
d+编号 | 删除断点 | bt | 查看调用堆栈 |
c | 从一个断点到下一个断点 (范围查找) |
finish | 将一个函数来运行结束就停下来 (范围查找) |
until+行号 | 在一个范围内直接运行到指定行(范围查找) | info locals | 查看当前栈帧局部变量的值 |
set var set var变量名=值 |
修改变量的值 (不需要改动代码,进行多分支测试使用) |
quit(q) ctrl + d |
退出gdb |
d+编号:这里的编号指:在Linux操作系统中,打完断电之后,会对打完断点的这些行进行重新排列顺序。
逐过程:每行看做一个整体包括函数(不进入函数)。
逐语句:C的语句,函数由多条语句构成(进入函数)。
五、Linux项目自动化构建工具--make/makefile
1、引入
makefile 的好处就是--"自动化构建",一旦写好,只需要make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile(它是个文件)中指令的命令工具,两者搭配使用,完成项目自动化构建。
2、如何写一个makefile
第一步:touch makefile 第二步:vim makefile 第三步:在makefile中写相关指令 第四步:退出
对于clean来说,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令将不会被自动执行,但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是总是被执行的。