资讯动态

Linux系统篇(五)工具篇·一:软件工具与动静态库

发布时间:2026/10/9 10:12:31 来源:尧图企业网站定制
◆博主名称少司府欢迎来到少司府的博客☆*: .. o(≧▽≦)o ..:*☆⭐数据结构系列个人专栏初阶数据结构 高阶数据结构⭐C基础个人专栏C初阶 C进阶⭐Linux个人专栏Linux系统编程⭐琢玉成器终有时笔底生花夺锦归目录1. 软件包管理器1.1 什么是包管理器1.2 Linux软件的生态1.3 yum/apt具体操作1.4 安装源2. Vim编辑器2.1 vim的模式2.2 vim的命令模式的命令集2.3 vim的底行模式的命令集2.4 使用vim的技巧3. Vim编辑器的配置3.1 手动配置3.2 网络下载4. gcc和g4.1 程序的翻译过程4.1.1 预处理进行宏替换4.1.2 编译生成汇编4.1.3 汇编生成机器可识别代码4.1.4 链接链接库文件生成可执行程序4.2 条件编译4.2.1 Linux中的条件编译4.2.2 条件编译的用途4.2.3 编译器的产生4.3 动静态库4.3.1 什么叫做动态库4.3.2 什么叫静态库4.3.3 动静态库对比4.3.4 验证4.4 周边问题1. 软件包管理器Linux中安装软件的方式1、源码安装2、软件包安装 --- rpm3、包管理器 yumcentos apt/apt-getubuntu相关知识软件程序之间是存在依赖的他可能需要多个第三方的库单独下软件的话可能不能运行。例如ls命令需要C语言的库如果使用软件包安装那么可能出现依赖缺失问题、版本兼容性问题。因此我们推荐使用包管理器安装源码安装很复杂。并且安装的本质就是拷贝在Linux下安装软件必须使用root安装在系统之后所有人都能使用。因此我们安装软件要把其相关的依赖一起安装包管理器会自动解决依赖问题。1.1 什么是包管理器包管理器类似于手机上的应用商店用于下载软件可以解决依赖问题。那么Linux上的软件谁提供的呢1.2 Linux软件的生态Linux下载软件的过程操作系统好坏的评估--生态问题为什么有人免费维护特定社区提供第三方开源库本质上开源就是一种商业模式有人用该社区的库那么就不希望该社区倒了会自己募捐。软件依赖问题国内镜像有很多社区、第三方库是外网的不方便下载国内就有大佬做镜像的工作把这些东西放到国内的网站上。由此我们可以利用apt下载一个好玩的软件apt -y install sl运行结果如图1.3 yum/apt具体操作1、查找所有包含sl名字的软件apt list | grep sl2、强制卸载sl软件apt remove -y sl3、安装sl软件apt install -y sl安装lrzsz软件apt install -y lrzsz #lrzsz用于Linux与Windows互传文件注意关于apt、yum的所有操作必须保证网络通畅可以用ping命令来检测ping www.baidu.com1.4 安装源如果是虚拟机需要关注如果是云服务器则不需要关注Ubuntu安装源路径$ cat /etc/apt/sources.list # 标准源 $ ll /etc/apt/sources.list.d/ # 扩展源 # ubuntu 安装扩展源就结合未来具体场景替换安装源解决外网问题。2. Vim编辑器打开vimvim关闭vim:q #或者快速按两下大写的Z写入文本并保存退出:wq #w就是保存的意思2.1 vim的模式vim本质上是一款多模式的编辑器其中最常见的是命令模式默认、插入模式、底行模式。命令模式下不允许写东西需要在插入模式进行。我们可以输入 i 来进入插入模式vim test.c如图INSTER表示现在是插入模式。插入模式不能直接退出要先回退到命令模式按一下键盘左上角ESC进入命令模式在命令模式下可以用两次大写Z来退出我们进入底行模式:英文的冒号此时可以输入q、wq等。我们可以在底行模式下用 set nu 来标记行号用ESC回退到命令模式。2.2 vim的命令模式的命令集在命令模式下1、移动相关gg光标快速回到最开始G光标回到最后n G光标回到第n行例如8 Gshift 键盘上面的4光标到该行结尾……shitf 键盘上面的6光标到该行最开始h左j下k上l右当然目前vim也支持上下左右的键但是使用最多是hjkl这四个。w以单词为单位向后移动默认是一个单词可以带数字b以单词为单位向前移动默认是一个单词可以带数字2、编辑相关yy复制当前行前面可以加数字n表示从光标行开始复制后n行p光标所在位置进行粘贴前面可以加数字n表示粘贴n次复制的内容u撤销ctrl r撤销u操作注意一旦退出文件编辑就无法进行撤销了但是只是q保存没有退出可以撤销。dd剪切可以加数字n表示从光标行开始剪切后n行也可以用于删除x删除光标所在位置的字符可以加数字n向后删n个X删除光标左侧字符可以加数字r替换光标所在字符先输入r在输入目标字符可加数字n表示替换为n个目标字符R批量化替换进入replace模式替换模式以行为单位不断替换光标所在字符esc返回命令模式~大小写切换shift ctrl v进入视图模式该模式下可以用hjkl进行区域的选择然后用 I shift i直接切换到插入模式进行操作输入 // 进行注释再esc回退就可以批量注释了。进入视图模式之后可以用命令模式的命令进行批量化注释、批量化删除、批量化补充#shift 3选中光标所在位置的单词n进行逆向查找和#混合使用进入插入模式的三个指令——i直接进入插入模式a光标向后移动一个字符并进入插入模式o新起一行并进入插入模式2.3 vim的底行模式的命令集前面说了冒号表示进入底行模式w保存q退出q强制退出wq强制保存并退出set nu设置行号set nonu取消行号有两个意思一个是表示强制另一个 Linux系统的命令则可以直接操作系统不用退出文件编辑如图按任意键继续回到命令模式%s/原目标字符/替换的字符/ 底行模式的批量化替换vim 文件名vim编辑器外面有两个含义——若存在该文件表示用vim编辑器进入该文件若不存在也可以进入用wq保存退出之后会自动生成该文件。vs 文件名表示分屏如图该命令和上一条一样也可以创造文件。另一个要注意的是光标在哪个文件下表示操作哪个文件模式也是其对应的模式。分屏可以分多个。ctrl ww表示在分屏下光标切换到另一个文件2.4 使用vim的技巧vim 文件名 n表示打开文件时光标自动定位到第n行例如vim code.c 14!v表示自动执行最近匹配的以v开头的命令user1iZn4adydu3h6t497949n3dZ:~/lesson5$ !v vim code.c3. Vim编辑器的配置3.1 手动配置在家目录下查看文件.vimrc如果没有则创建再用 vim .vimrc 进入该配置文件输入要配置的信息。例如set nu当再进入vim编辑器的时候配置信息立刻生效如果不想要配置信息可以用双引号注释掉因此vim配置其实就是修改vimrc文件。我们也可以在 /etc/vimrc 下配置但是这个是全局的配置文件会对所有账号生效推荐只配置自己的。set nu 设置行号 syntax on 设置语法高亮 set tabstop4 设置tab缩进长度为4空格 set autoindent 设置自动缩进 set cindent 针对C语言的缩进功能 如图是我们自己配置的vim文件。3.2 网络下载除了自己手动配置外可以在gitee上查找别人的一键式配置链接在家目录下输入。注意一定要在普通用户下用防止root用户下出问题4. gcc和g如图gcc 文件名 进行编译默认生成 a.out 的可执行程序再 ./a.out 运行该程序。4.1 程序的翻译过程gcc code.c -o mycode #生成可执行程序mycode gcc -o mycode.exe code.c #也可以这样写注意-o后面跟生成的文件4.1.1 预处理进行宏替换1、进行宏替换2、去除注释3、头文件展开4、进行条件编译如图是code.c文件如图-E表示开始进行程序翻译在预处理完成的时候就停下来.i表示临时文件。其中code.i 仍然是c语言文件。4.1.2 编译生成汇编gcc -S code.i -o code.s生成汇编文件.s为汇编文件的后缀。-S表示从现在开始进行程序的翻译编译做完了就停下来。为什么C/C编译要先变成汇编早期计算机编程是二进制编程但这个不方便后来有了汇编语言也因此编译器产生了。基于汇编语言出现了许多编译型语言例如C/C。汇编语言已经发展许久了我们站在巨人的肩膀上先把C/C编译成汇编再将汇编翻译成二进制这个步骤大佬已经做过了只需要翻译成汇编这一步骤这样做更简单。4.1.3 汇编生成机器可识别代码gcc -c code.s -o code.o-c 表示开始进行翻译当汇编完成就停下来。code.o 叫做可重定位目标文件在Windows、vs2022中就是xxx.obj文件本身已经是二进制的了但是无法直接执行。code.o 仅仅把自己的源文件编译了但自己的源文件还包含了很多库方法没有和库进行链接因此无法直接执行。4.1.4 链接链接库文件生成可执行程序gcc code.o -o code小tips在编译的时候往往先生成.o文件再用gcc进行链接。gcc -c code.c #生成同名的.o文件即code.oldd 可执行程序文件名可以查看链接了哪些库。libc.so.6 就是c语言的库。1、动态库Linux(.so)windows(.dll)2、静态库Linux(.a)windows(.lib)什么叫动态库什么叫静态库如何理解4.2 条件编译4.2.1 Linux中的条件编译我们写一个具有条件编译的程序#include stdio.h #define M int main() { #ifndef M printf(社区版/免费版 version\n); #else printf(专业版/收费版 version\n); #endif }再进行编译运行可得到结果gcc code.c -o code ./code当我们注释掉M的定义之后也可以在Linux中用命令行的方式来宏定义M// #define Mgcc code.c -o code -DMD表示命令行级别的宏定义M表示定义的宏变量就是M不赋予初始值就是1我们也可以赋给M初始值gcc code.c -o code -DM100 #宏定义M为1004.2.2 条件编译的用途1、软件对于专业度、收费情况进行业务区分使用条件编译可以进行代码动态裁剪例如vs2022社区版免费版/ 专业版企业版2、内核源代码也是采用条件编译进行代码裁剪3、开发工具、应用软件对于多平台的适配例如同一软件可以在Windows、Linux两个平台上跑4.2.3 编译器的产生在4.1.2中我们讲过C/C为什么要先生成汇编这类编译型语言就需要编译器来把它生成汇编语言具体过程如下第一版编译器是二进制写的用于将汇编语言编程二进制版第二版编译器是汇编语言写的将这个编译器用第一版编译器编译一下之后第一版就不要了诞生了第一个用汇编语言写的汇编编译器。之后用这个汇编语言写的编译器来编译汇编语言。这个就是编译器的自举过程。C/C的编译器同理它们是C/C写的通过编译器自举来生成第二版编译器编译对应语言。4.3 动静态库库是一套方法或者数据集为我们开发提供最基本的保证基本接口功能加速我们二次开发例如C语言标准库libc.so.版本号C语言静态库libc.a.版本号在Linux中去掉前缀lib去掉 . 后面的后缀剩下的才是这个库的真实名字。上面C语言库的真实名字就是c例如xyz库就是 libxyz.so 或者 libxyz.a4.3.1 什么叫做动态库动态库以.so结尾其内部会自己实现方法我们自己的程序例如code.c会使用库中的方法例如printf将自己的程序和动态库链接起来就能在库中找到方法由此生成可执行程序。动态库典型的特点1、在执行目标方法的时候需要跳转到库中执行完成之后再返回。2、动态库也叫做共享库其被多个程序共享一旦缺失会导致所有程序无法执行所谓的链接也就是让我们的程序能找到库中方法的地址例如printf - libc.so:0x1234这就是动态链接。4.3.2 什么叫静态库那么什么叫静态链接呢静态链接就是将方法在对应位置拷贝到我们的程序中之后执行就直接在我们的程序中执行。静态库只有在链接时有用一旦形成可执行程序静态库就可以不再需要。4.3.3 动静态库对比1、动态库形成的可执行程序体积一定很小2、可执行程序对静态库的依赖小但动态库不能缺失3、程序运行需要加载到内存静态链接的会在内存中出现大量重复的代码4、动态链接保存的只是方法的地址比较节省资源4.3.4 验证如图gcc编译C语言默认使用的是动态链接。我们可以要求gcc使用静态编译gcc code.c -o code -static下载一下C语言静态库我的系统是阿里云的Ubuntu 22.04.5 LTSapt install -y build-essential libc6-dev检测一下是否有libc.a静态链接的方式编译code.c如图代码体积太大了。4.4 周边问题1、验证C的编译C和C基本上是一样的我们可以看一下C的库如图libstdc.so.6 就是C的标准库。我们可以用 file 命令来查看C/C程序的链接方式如图默认的也是动态链接。我们依旧可以用 -static 来进行静态链接2、关于动态库动态库本质让我们程序中公共的代码保证在内存中只出现一份。这个时候动态库也更应该叫做共享库。3、Linux系统中相当多的指令依赖C动态库4、普通用户的sudo在普通用户下我们可能无法执行sudo命令这时候我们需要切换到root用户并进入sudoers文件里面进行修改如图在Allow那一行下面加上红框框里面的内容这样user1就能使用sudo命令了。5、库的本质我们在分工写程序时不愿意将自己的 .c/.cpp 源文件直接给他人那么我们可以先将其编译成.o文件再交给别人链接。例如code.h 中声明了方法code.c中实现了方法main.c是主程序。我们不愿意直接给出code.c那么可以gcc -c code.c生成同名.o文件这样他人就可以用我们实现的方法而不暴露我们的源代码了。因此库的本质就是被打包起来的 .o 文件。例如.so文件本期的分享就到这里如果觉得博主的文章比较对胃口的话可以点一个小小的关注~您的三连是我持续更新的动力~

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑