【Linux系统编程】5. 基础开发⼯具(上)
文章目录
- 一、软件包管理器
- 1、什么是软件包
- 2、Linux软件⽣态
- 3、yum具体操作
- 1)查看软件包
- 2)安装软件
- 3)卸载软件
- 4)查看网络连接
- 4、安装源
- 二、编辑器 - Vim
- 1、Linux编辑器-vim
- 2、vim的基本模式
- 3、vim的基本操作
- 4、vim命令模式命令集
- 5、vim末⾏模式命令集
- 7、简单vim配置
- 三、编译器 - gcc/g++
- 1、背景知识
- 2、gcc编译过程
- 1)预处理(进⾏宏替换)
- 2)编译(⽣成汇编)
- 3)汇编(⽣成机器可识别代码)
- 4)链接(⽣成可执⾏⽂件或库⽂件)
- 3、动态链接和静态链接
- 4、静态库和动态库
一、软件包管理器
1、什么是软件包
在Linux下安装软件,⼀个通常的办法是下载程序的源代码,并进⾏编译,得到可执⾏程序。
但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安装。
-
软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系。
-
yum(Yellow dog Updater,Modified)是Linux下⾮常常⽤的⼀种包管理器。主要应⽤在Fedora,RedHat,Centos等发⾏版上。
-
Ubuntu:主要使⽤apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依赖关系、下载和安装软件包的功能。
2、Linux软件⽣态
-
Linux下载软件的过程(Ubuntu、Centos、other)

-
操作系统的好坏评估—⽣态问题

-
为什么会有⼈免费特定社区提供软件,还发布?还提供云服务器让你下载?

-
软件包依赖的问题

- 国内镜像源??

以下是⼀些国内Linux软件安装源的官⽅链接:
- 阿⾥云官⽅镜像站
◦ 官⽅链接:https://developer.aliyun.com/mirror/
◦ 阿⾥云提供了丰富的Linux发⾏版镜像,包括CentOS、Ubuntu、Debian等,⽤⼾可以通过该镜像站快速下载和更新软件包。- 清华⼤学开源软件镜像站
◦ 官⽅链接:https://mirrors.tuna.tsinghua.edu.cn/
◦ 清华⼤学镜像站提供了多种Linux发⾏版的镜像,以及Python、Perl、Ruby等编程语⾔的扩展包。该镜像站还提供了丰富的⽂档和教程,帮助⽤⼾更好地使⽤这些软件包。- 中国科学技术⼤学开源镜像站
◦ 官⽅链接:http://mirrors.ustc.edu.cn/
◦ 中科⼤镜像站提供了多种Linux发⾏版的镜像,以及常⽤的编程语⾔和开发⼯具。⽤户可以通过该镜像站⽅便地获取所需的软件包和⼯具。- 北京交通⼤学⾃由与开源软件镜像站
◦ 官⽅链接:https://mirror.bjtu.edu.cn/
◦ 北交⼤镜像站提供了多种Linux发⾏版的镜像,以及相关的软件仓库和⼯具。该镜像站还提供了详细的⽂档和指南,帮助⽤⼾配置和使⽤这些软件源。- 中国科学院软件研究所镜像站(ISCAS)
◦ 官⽅链接:http://mirror.iscas.ac.cn/
◦ ISCAS镜像站提供了多种Linux发⾏版、编程语⾔和开发⼯具的镜像。⽤⼾可以通过该镜像站快速获取所需的软件包和更新。- 上海交通⼤学开源镜像站
◦ 官⽅链接:https://ftp.sjtu.edu.cn/
◦ 上海交⼤镜像站提供了丰富的Linux软件资源,包括多种发⾏版的镜像和软件仓库。⽤户可以通过该镜像站⽅便地下载和安装所需的软件包。- ⽹易开源镜像站
◦ 官⽅链接:http://mirrors.163.com/
◦ ⽹易镜像站提供了多种Linux发⾏版的镜像,以及相关的软件仓库和⼯具。该镜像站还提供了便捷的搜索功能,帮助⽤⼾快速找到所需的软件包。
此外,还有⼀些其他的国内镜像源,如搜狐开源镜像站等,但可能由于时间变化或政策调整,部分镜像站的链接或状态可能有所变动。因此,建议⽤户在使⽤前访问官⽅⽹站或咨询相关社区以获取最新的信息和帮助。

3、yum具体操作
1)查看软件包
通过 yum list 命令可以罗列出当前⼀共有哪些软件包。由于包的数⽬可能⾮常之多,我们需要使⽤ grep 命令只筛选出我们关注的包。

- lrzsz:是软件包的名称
- .x86_64:后缀表⽰64位系统的安装包
- 0.12.20-43:是软件包的版本号和发布次数,0.12.20 是版本号,43 表示这个版本的第 43 次发布。
- .el8:说明该软件包适配的是 RHEL 8 及其衍生系统(如 CentOS 8 )
- BaseOS表⽰的是 “软件源” 的名称,类似于 “⼩⽶应⽤商店”,“华为应⽤商店” 这样的概念。
2)安装软件
通过 yum,我们可以通过很简单的⼀条命令完成 gcc 的安装。
# Centos
sudo yum install -y lrzsz# Ubuntu
sudo apt install -y lrzsz
- yum/apt 会⾃动找到都有哪些软件包需要下载,这时候敲 “y” 确认安装。
- 出现 “Complete!” 字样或者中间未出现报错,说明安装完成。
注意事项:
- 安装软件时由于需要向系统⽬录中写⼊内容,⼀般需要 sudo 或者切到 root 账户下才能完成。
3)卸载软件
# Centos
sudo yum remove [-y] lrzsz# Ubuntu
sudo apt remove [-y] lrzsz
- -y:跳过确认提示环节,直接自动执行卸载 lrzsz 软件包的操作
4)查看网络连接
关于 yum / apt 的所有操作必须保证主机(虚拟机)⽹络畅通!!!
可以通过 ping 指令验证:
ping www.baidu.com

4、安装源
Centos系统安装 EPEL 软件源:
sudo yum install epel-release

好玩的命令:https://blog.csdn.net/xiaoxiaosutang/article/details/141053674
二、编辑器 - Vim
- IDE例⼦

1、Linux编辑器-vim
vi / vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、mac os、windows。
2、vim的基本模式
vim有许多模式,这里主要讲解vim的三种模式,分别是命令模式、插⼊模式和底⾏模式,各模式的功能区分如下:
- 正常/普通/命令模式
控制屏幕光标的移动,字或⾏的删除,移动复制某区段及进⼊插入模式下,或者到底行模式。
- 插⼊模式
只有在插入模式下,才可以做⽂字输⼊,按 ESC 键可回到命令⾏模式。
- 末⾏模式
⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。
在命令模式下,shift+;即可进⼊该模式;按 ESC 键可回到命令⾏模式。
要查看你的所有模式:使用vim随便打开一个文件,底⾏模式直接输⼊ :help vim-modes
3、vim的基本操作
-
进⼊vim:
vim 文件名
注意:进⼊vim之后,是处于正常模式,要切换到插⼊模式才能够输⼊⽂字。 -
正常模式 切换 插⼊模式
a:在光标当前位置后插入
i:在光标当前位置前插入
o:在光标所在行下方新建一行插入 -
插⼊模式 切换 正常模式
ESC键 -
正常模式 切换 底⾏模式
冒号: -
退出vim及保存⽂件
在正常模式下,按冒号:进⼊底行模式,再输入以下指令
w:仅保存文件,不退出
wq:保存文件并退出
q!:不保存并强制退出

4、vim命令模式命令集
-
移动光标
vim可以直接⽤键盘上的↑ ↓ ← →来控制光标上下左右移动,但正规的vim是⽤⼩写英⽂字⺟h、j、k、l来控制光标左下上右移动。$: 移动到光标所在⾏的 “⾏尾”
^: 移动到光标所在⾏的 “⾏⾸”
w: 光标跳到下个字的开头
e: 光标跳到下个字的字尾
b: 光标回到上个字的开头
n+l: 光标向后移动n个位置,默认是1。如:5l,56l
gg: 光标定位到文章开头
n+G: 光标定位到⽂章第n行,默认是文章末尾
ctrl+b: 屏幕往“后”移动⼀⻚
ctrl+f: 屏幕往“前”移动⼀⻚
ctrl+u: 屏幕往“后”移动半⻚
ctrl+d: 屏幕往“前”移动半⻚ -
删除⽂字
n+x: 光标向后删除 n 个字符(包含⾃⼰在内),默认是1 。
n+X: 光标向前删除 n 个字符(包含⾃⼰在内),默认是1。
n+dd: 从光标所在⾏开始删除 n ⾏,默认是1。 -
复制
yw: 复制从光标当前位置到当前单词末尾的内容。
n+yw: 从光标位置开始,连续复制 n 个单词的内容。
yy: 复制当前行。
n+yy: 复制从当前行开始的 n 行。
p: 粘贴 1 次复制的内容。
n+p: 粘贴 n 次复制的内容。 -
替换
r:替换光标所在的 1 个字符。
n+r:用同一字符替换 n 个连续位置。
R:边输入边替换,字符可不同。 -
撤销上⼀次操作
u:撤销上一次操作。
ctrl+r:恢复被撤销的内容。 -
更改
cw: 从光标位置开始删除到当前单词末尾。
c n w: 从光标位置开始,连续删除 n 个单词的内容。
5、vim末⾏模式命令集
在使⽤末⾏模式之前,先按 ESC 键确定已经处于正常模式,再按 :冒号即可进⼊末⾏模式。
-
列出⾏号
set nu:在⽂件中的每⼀⾏前⾯列出⾏号。 -
跳到⽂件中的某⼀⾏
n:跳到第n行。 -
查找字符
/关键字: 从当前位置向文件末尾方向搜索指定关键字,n跳转到下一个匹配项,N跳转到上一个匹配项。
?关键字: 从当前位置向文件开头方向搜索指定关键字,n跳转到下一个匹配项,N跳转到上一个匹配项。 -
保存⽂件并退出vim
w:仅保存文件,不退出
wq:保存文件并退出
q!:不保存并强制退出
7、简单vim配置
配置⽂件的位置
- 在⽬录/etc/下⾯,有个名为vimrc的⽂件,这是系统中公共的vim配置⽂件,对所有⽤户都有效。
- ⽽在每个⽤户的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为
.vimrc。 - 操作如下:
1:切换为自己的用户:su 用户名,输入自己用户名所对应的密码。
2:进⼊⾃⼰的主⼯作⽬录:cd ~
3:打开⾃⼰⽬录下的.vimrc⽂件:vim .vimrc
4:根据自己的需求,输入各种配置的信息。
常⽤配置选项
- 设置语法⾼亮:syntax on
- 显⽰⾏号:set nu
- 设置缩进的空格数为4:set shiftwidth=4
这里只列举了几种,网上还有许多有用的配置选项。
使⽤插件
- 要配置好看的vim,原⽣的配置可能功能不全,可以选择安装插件来完善配置,保证⽤户是你要配置的⽤户。
- 安装TagList插件,下载taglist_xx.zip,解压完成,将解压出来的doc的内容放到〜/.vim/doc,将解压出来的plugin下的内容拷⻉到〜/.vim/plugin。
- 在〜/.vimrc中添加:
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Use_Right_Window=1
- 安装⽂件浏览器和窗⼝管理器插件:WinManager。下载2.X版本以上的winmanager.zip,解压winmanager.zip,将解压出来的doc的内容放到〜/.vim/doc,将解压出来的plugin下的内容拷⻉到〜/.vim/plugin。
- 在〜/.vimrc 中添加
let g:winManagerWindowLayout=‘FileExplorer|TagList nmap wm :WMToggle<cr>
更具体操作请移步:https://blog.csdn.net/wooin/article/details/1858917
参考资料:Vim 从入门到精通
三、编译器 - gcc/g++
1、背景知识
- 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)
- 编译(⽣成汇编)
- 汇编(⽣成机器可识别代码)
- 链接(⽣成可执⾏⽂件或库⽂件)
2、gcc编译过程
语法: gcc [选项] 要编译的文件 [选项] [目标文件]
选项:
- -E:仅执行预处理,生成指定 .i 文件
- -S:仅编译到汇编代码,生成 .s 文件
- -c:仅编译到目标文件,生成 .o 文件
- -o < file >:指定输出文件名称
注意: gcc 编译C语言源代码时不加额外选项会直接生成可执行文件。
1)预处理(进⾏宏替换)
- 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码⾏。
// code.c
#include<stdio.h>
int main()
{ printf("Hello world\n"); return 0;
}
实例:对 code.c 进行预处理并将结果输出到 code.i 文件
gcc -E code.c -o code.i
2)编译(⽣成汇编)
- 在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc把代码翻译成汇编语⾔。
实例:将预处理后的 code.i 文件编译为汇编代码文件 code.s
gcc -S code.i -o code.s
3)汇编(⽣成机器可识别代码)
- 汇编阶段的核心是将汇编语言代码(如 .s 文件)转换为机器可直接识别的二进制指令( .o 目标文件)。
实例:将汇编代码文件 code.s 汇编为目标文件 code.o
gcc -c code.s -o code.o
4)链接(⽣成可执⾏⽂件或库⽂件)
- 链接阶段的核心是将一个或多个目标文件(.o)及所需库文件整合,生成可直接执行的程序或库文件。
实例: 将目标文件 code.o 链接为可执行文件 code
gcc code.o -o code
生成可执行程序后,我们就可以直接运行了:./code

3、动态链接和静态链接
在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个 *.c ⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。
示例如下:gcc code1.o code2.o code3.o -o code
静态链接的缺点:
-
浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了 printf() 函数,则这多个程序中都含有printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
-
更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程序。
静态链接的优点:
- 在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。
动态链接的出现解决了静态链接中提到的问题。动态链接的基本思想是把程序按照模块拆分成各个相对独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。
动态链接其实远⽐静态链接要常⽤得多。⽐如我们查看下 code 这个可执⾏程序依赖的动态库,会发现它就⽤到了⼀个c动态链接库:ldd code

注意: ldd命令用于打印程序或者库文件所依赖的共享库列表。
在这⾥涉及到⼀个重要的概念:库
-
我们的C程序中,并没有定义 “printf” 的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,⽽没有定义函数的实现,那么是在哪⾥实“printf” 函数的呢?
-
最后的答案是:系统把这些函数实现都做到名为 libc.so.6 的库⽂件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径 “/usr/lib” 下进⾏查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,⽽这也就是链接的作⽤。
4、静态库和动态库
-
库是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,加速我们二次开发)。
-
静态库是指编译链接时,把我们程序中使用的库方法拷贝给我自己,因此⽣成的⽂件⽐较⼤。静态库只有在链接的时候有用,一旦形成可执行程序,静态库可以不再需要。其后缀名⼀般为
.a。 -
动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为
.so,如前⾯所述的libc.so.6就是动态库。gcc 在编译时默认使⽤动态库。完成了链接之后,gcc 就可以⽣成可执⾏⽂件,如下所⽰:gcc code.o –o code。 -
gcc默认⽣成的⼆进制程序,是动态链接的,这点可以通过
file命令验证。

示例如下:

注意:
- Linux下,动态库(.so),静态库(.a)
- Windows下,动态库(.dll),静态库(.lib)
⼀般我们的云服务器,C/C++的静态库并没有安装,可以采⽤如下⽅法安装。
Centos系统安装C静态库 :sudo yum install -y glibc-static
Centos系统安装C++静态库:sudo yum install libstdc++-static
接下来就可以通过静态链接来生成可执行文件:gcc code.c -o code-static -static

可以看到静态库形成的可执行文件大小是相当大的。
