2 Linux环境基础开发工具
2.1 Linux软件包管理器yum
2.1.1 软件安装的方式
1. 源码安装
大多数开源的软件都是源码的形式。拿过来自己编译,安装。
优点:源码安装兼容性好。
缺点:过程繁琐还容易卡壳。
2. rpm安装
RPM(Red-Hat Package Manager)红帽的软件包管理器。一般rpm安装使用rpm包,rpm包和tar包、gzip等不同,这些是压缩包,而rpm包是源码和一些安装规则的集合。使用RPM方式来安装后会指定软件安装位置,并生成对应的配置文件、服务启动脚本文件等。
优点:简化安装方式,不需要联网!
缺点:指定rpm包去安装,没有解决依赖关系。
3. yum安装
是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包。
优点:再次简化安装
缺点:需要联网,更准确的说法是需要有一个yum源。大型的公司都会有自己的yum源,或者是找到可访问的yum源,修改yum配置文件中的yum源地址,并使之生效,这样就可以用yum进行软件安装了。
2.1.2 查看软件包
这里主要介绍CentOS7下安装软件的方式。
通过yum list命令可以查看当前一共有哪些软件包,由于包的数量非常之多,使用grep命令筛选出我们所专注的包。例如:
yum list | grep lrzsz
2.1.3 安装软件
yum install lrzsz
注意:
- 安装软件时需要向系统目录中写入内容,需要使用sudo或者切换到root用户才可以。
- 输入命令后,yum会自动找到有哪些软件包需要下载,询问时只要输入“y”即可自动安装。
2.1.4 卸载软件
yum remove lrzsz
注意:
- 卸载软件也要使用sudo或者切换到root用户
2.1.5 常用软件安装
yum install lrzsz
用户XShell和Linux之间的文件传输工具
yum install gcc
C程序编译器
yum install g++
C++程序编译器
yum install gdb
程序调试工具
yum install glibc-static
静态库
2.2 Linux文本编辑器Vim
Vim中总共有12种模式,6种基本模式,6种条件模式。常用的有三种模式:
- 插入模式:只有在插入模式下,才可以做文字输入。
- 普通模式:控制屏幕光标的移动,字符或行的删除和复制。
- 底行模式:文件保存或退出,进行字符串查找和行定位等。
-
从普通模式切换到插入模式
i:进入插入模式,并且从光标所在位置开始插入
a:光标移动到下一个字符处开始插入
o:在光标所在行下方添加新航,进行插入模式
I:光标移动到行首,开始插入
A:光标移动到行尾,开始插入
O:在光标所在行上方添加新行,进入插入模式 -
从插入模式切换到普通模式
ESC -
从普通模式切换到底行模式
冒号:
:w 保存文件
:q 退出
:wq 保存并退出
:q! 强制退出,不保存
:!pwd 临时执行一条命令,回车返回 -
普通模式下的常用操作
-
移动光标位置
hjkl 分别对应上下左右移动光标
0 光标移动到行首
$ 光标移动到行尾
w 光标向后移动一个单词(以特殊字符进行区分
b 光标向前移动一个单词
gg 光标移动到文档首行
G 光标移动到文档尾行
ctrl+f 向下翻页
ctrl+b 向上翻页 -
拷贝
yy 复制光标所在行
nyy 从光标所在行开始向下复制n行数据 -
粘贴
p 向光标所在行下方粘贴剪切板内容
P 向光标所在行上方粘贴剪切板内容 -
剪切/删除
dd 剪切/删除光标所在行
ndd 从光标所在行开始向下剪切/删除n行数据
dw 从光标所在位置开始剪切/删除一个单词
D 从光标所在位置开始剪切/删除到行尾的数据
x 剪切/删除光标所在位置的字符 -
其他
u 撤销上一步操作
ctrl+r 恢复操作
gg=G 全文对齐
:n 跳到第n行
/字符串 字符串匹配,按n可以跳到下一个匹配字符串
?字符串 也是字符串匹配,按n可以跳到上一个匹配字符串
:1,3s/select/epoll/g 将1-3行中的select替换成epoll 不指定行数就是全部替换
2.3 Linux编译器gcc/g++
一份代码文件要变成可执行程序要经历四个阶段:
- 预处理
- 编译
- 汇编
- 链接
- 预处理
- 预处理完成的内容主要包括:红替换、头文件展开、条件编译、去注释、文件包含等
- 实例:
gcc -E hello.c -o hello.i
- 选项“-E”的作用是让gcc只完成预处理就停止编译
- 选项“-o”是指定要生成的目标文件,“.i”文件是经过预处理的C原始程序
- 编译
- 在编译阶段,gcc首先要检查代码的规范性,是否有语法错误等,在检查无误后再将代码编译成汇编语言
- 实例:
gcc -S hello.i -o hello.s
- 选项“-S”的作用是让gcc只完成编译即停止编译过程
- 汇编
- 汇编阶段是把编译阶段生成的“.s”文件转换成目标文件
- 实例:
gcc -c hello.s -o hello.o
- “-c”选项是将汇编代码转换成“.o”的二进制目标代码
- 链接
-
链接阶段主要是将彼此有关的目标文件进行连接,使所有的目标文件成为一个能被操作系统执行的统一整体
-
实例:
gcc hello.o -o hello
在这里涉及到另一个重要的概念:函数库
函数库一般分为静态库和动态库两种 -
函数库文件是指将很多的机器代码/代码文件合并到一起打包生成的文件。
-
静态库是指编译链接时,将库文件的代码全部加入到可执行文件中,因此生产的文件比较大,但在运行时也就不需要库文件了。静态库文件名一般为lib***.a,lib是前缀,.a是后缀。
-
动态库则与之相反。在编译链接时并没有将库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。所以动态库又称为共享库,运行时库。动态库文件名一般为lib***.so,lib是前缀,.so是后缀。
-
gcc默认是使用动态链接,要使用静态链接是,在gcc选项中加上“-static”
-
链接方式的对比
动态链接:只是记录了一些关于动态库函数的位置符号信息(生成文件小)
优点是节省资源,更新升级方便;缺点是对库的依赖程度比较高,运行时需要存在。
静态链接:直接将静态库中的数据全部拷贝到可执行程序中(生成文件大)
优点是对库的依赖程度比较小;缺点是相对于动态链接资源浪费比较高,更新升级比较繁琐。
2.4 Linux项目自动化构建工具make/Makefile
Makefile是一个不普通的文本文件,它可以辅助用户完成各种大型项目的编译,在其中可以记录各种编译规则,用make这个工具对Makefile中记录的规则,逐条解释执行(make只是解释规则,最终依然还是使用编译器来完成编译过程)。
Makefile命名规则:makefile/Makefile
#Makefile注释以#开头
#编写规则:
# 目标对象名称:依赖对象名称
# tab[\t]为了生成目标对象所要执行的命令
#make程序解释Makefile文件中规则的流程:
# 1.先找目标对象
# 永远只生成第一个对象,第一个对象命令执行完毕就退出了
# 2.找到目标对象之后,跟依赖对象进行时间属性对比
# 判断程序是否是最新的,是否需要重新编译
# 3.执行为了生成目标对象所要执行的命令
# 这条命令,不一定非要生成目标对象
# make可以直接在外部指定要执行生成的对象
# make clean
# 伪对象:不管目标对象是不是最新的,都需要重新生成
# 声明伪对象:.PHONY
#.PHONY:main test
#定义all对象是因为make只找第一个对象生成,其他对象将不再执行,但又是想要生成多个多个对象,
#那么就需要定义第一个对象,它的依赖对象是我们想要生成的其它所有对象,make为了生成第一个对象,
#会间接的去生成这些依赖对象
# makefile中的预定义变量
# 预定义变量是用于执行命令中
# $@:指的是目标对象
# $^:指的是所有的依赖对象
# $<:指的是所有的依赖对象中的第一个依赖对象
# wildcard 关键字,用于获取文件名
# $()用于使用一个变量
src=$(wildcard ./*.c)
all:main test
#main:main.c child.c
# gcc main.c child.c -o main
main:$(src)
gcc $^ -o $@
test:main.c child.c
gcc main.c child.c -o test
#将clean声明为伪对象,就是为了防止外部有跟clean同名的文件,导致出现因为文件最新而不重新执行命令的问题
.PHONY:clean
clean:
rm main
2.5 Linux调试器gdb
-
程序的发布方式有两种,debug模式和release模式
gcc/g++编译出来的默认是release模式 -
要使用gdb对程序进行调试,必须在编译的时候加上-g选项,在生成可执行程序的时候加入调试符号信息
-
将程序符号信息加载进入gdb中
gdb./main(直接加载并进入gdb调试)
file./main(已经进入gdb中) -
逐步调试:
start 开始逐步调试
n 下一步(不会跟踪进入函数)
s 下一步(会跟踪进入函数)
untill n 直接运行到第n行停下
run 从开始重新运行 -
断点相关操作
b file:line 打断点
b main.c:20 给main.c文件的第二十行打断点
b myswap 给myswap函数打断点
watch i 监控i变量
d 删除所有断点
d b n 删除序号为n的断点
info breakpoint/i b 查看断点信息 -
查看变量
p 打印变量内容(&查看变量地址;*查看指针接引用内容) -
查看函数调用栈
bt 快速定位程序崩溃位置 -
其他
l 查看运行代码的上下五行代码
l n 查看第n行代码的上下五行代码
c 继续运行
2.6 Linux命令行使用项目版本控制工具git
安装git
yum install git
创建项目
在github网页上创建好项目,将项目链接复制好以备下载
下载项目
git clone url
在Linux中创建好一个放置代码的目录
url即是刚刚复制的项目链接
git三板斧
-
git add
将代码放到刚刚创建好的目录
git add 文件名
将需要用git管理的文件告知git -
git commit
提交改动到本地
git commit 目录
-
git push
同步到远程服务器上
git push
需要填入用户名和密码
git与svn的区别:
- git是分布式版本控制系统,svn是集中式版本控制系统。
- git为用户建立了一个本地仓库,绝大多数操作都只需要访问本地文件和资源,不必联网就可以看到所有的历史版本记录,而svn却需要联网。
- git克隆一个完整项目的速度要比svn快很多。
- git的分支远比svn的强大,内容完整性要优于svn。
- git只关心文件数据整体是否发生变化,而svn则只关心文件内容的具体差异。