——基础开发工具(上)软件包管理器、vim、gcc/g++)
⭐️博主此生决int-CSDN博客速胜派就是最大的投降派热门专栏深入理解 C 系列算法系列快速复习系列Linux系列Gitee地址财哥 | GitHub地址财哥文章目录上期回顾2. 基础开发工具1. 软件包管理器 yum/apt核心概念yum 三板斧【重点】yum 与 apt 对照【易混】安装源与包名解读CentOSUbuntu2. 编辑器 Vim核心多模式【重点】正常模式命令集末行模式命令集命令总结批量注释【重点】配置文件3. 编译器 gcc/g编译四阶段【复习】条件编译3-3 动态链接和静态链接多文件编译静态链接动态链接3-4 静态库和动态库静态库 .a动态库 .so动态链接 vs 静态链接【易混】【重点】其他常用选项暂时不讲仅了解验证与静态链接准备下期预告基础开发工具中——makefile、进度条、git结语上期回顾大家好这里是此生弃int财哥欢迎来到我的博客。上一篇我们主要学习了Linux权限相关内容了解了Linux的权限怎么管理怎么查看。进一步加深了对Linux这一多用户操作系统的了解。今天我们就开学习一下Linux的一些基础开发工具。2. 基础开发工具1. 软件包管理器 yum/apt一般软件的安装方式1源码安装2软件包安装3包管理器安装✅核心概念软件包预编译好、可直接安装的程序成品对应 Windows 安装包。包管理器负责搜索/下载/安装/卸载软件包的工具≈ 手机应用商店。依赖软件运行还需要其他软件陪着包管理器的核心价值 自动解决依赖缺失 版本兼容。安装本质 网络下载 拷贝到系统目录 →需要sudoroot 权限装一次全系统可用。软件生态评估 OS 好坏不只看系统本身还看内核/社区/文档/用户群体/配套软件。- 软件链条开发者发源码 → 社区编译打包 → 官方源服务器 → yum/apt 下载安装。镜像源保存同样软件包的复制站点改内置下载链接 换源国内阿里云/清华/中科大。开源本质是一种商业模式代码开放靠服务/支持/定制/平台盈利。yum 三板斧【重点】yum list|grep包名# 查列出并筛选软件包| 是管道把前面输出交给后面处理sudoyuminstall[-y]包名# 装下载安装并自动处理依赖-y 自动确认sudoyum remove[-y]包名# 卸卸载软件包注意事项安装前先ping www.baidu.com验证网络。同一时刻只能进行一个 yum/apt 操作否则报被占用。查不到包包名写错 / 源未配置 / 网络问题。yum 与 apt 对照【易混】目的CentOSyumUbuntuapt搜索yum list | grep 包名apt search 包名查看信息yum info 包名apt show 包名查看已安装yum list installedapt list --installed安装sudo yum install 包名sudo apt install 包名卸载sudo yum remove 包名sudo apt remove 包名更新软件源索引yum makecachesudo apt update升级软件包sudo yum updatesudo apt upgrade安装源与包名解读CentOSCentOS 源配置目录/etc/yum.repos.d/。-CentOS-Base.repo 标准源稳定epel.repo 扩展源求全。装扩展源sudo yum install -y epel-release。包名xxx.x86_64 1.0-3.el7 basex86_64 64 位架构el7 面向 CentOS 7base 提供它的软件源名。UbuntuUbuntu 源配置文件/etc/apt/sources.list额外源配置目录/etc/apt/sources.list.d/。sources.list/*.sources 软件源配置*.list 传统的软件源配置文件。Ubuntu 没有与 CentOSepel-release完全对应的统一扩展源第三方软件通常通过 PPA、官方提供的软件源等方式添加。Ubuntu 官方仓库主要分为main 官方支持的核心软件universe 社区维护的软件restricted 受限制的专有软件/驱动multiverse 受版权或法律限制的软件。包名tree/jammy,now 2.0.2-1 amd64 [installed]amd64 64 位 x86 架构jammy Ubuntu 22.042.0.2-1 软件包版本[installed] 已安装。2. 编辑器 Vim核心多模式【重点】vim 只是编辑器写代码不管编译gcc和调试gdbIDE 三者集成。vim 是 vi 升级版兼容 vi 全部指令共 12 种模式掌握 3 种即可。模式用途进入方式正常/命令模式默认移动、删除、复制Esc随时返回插入模式输入文字i光标前 /a光标后 /o下方新行末行模式保存、退出、查找正常模式按:【易忘】进入 vim 默认是正常模式直接打字不会输入是在执行命令。正常模式命令集以下命令前加数字连续执行该命令多少次或者跳转的第数学行类别命令移动h/j/k/l左下上右G文末gg文首#G跳第 # 行$行尾^行首w/e/b按词跳ctrlf/b整页ctrld/u半页删除x删字符#x删 n 个dd删行#dd删 n 行复制粘贴yy复制行#yy复制 n 行yw复制词p粘贴替换撤销r替换 1 字符R连续替换cw删词并进入插入u撤销ctrlr恢复末行模式命令集命令功能:w/:q/:wq/:q!保存 / 退出 / 保存并退出 / 强制不存退出:set nu显示行号:#跳第 # 行/关键字n向后查找 下一个?关键字向前查找命令总结作用Vim 命令类似 Windows 命令复制当前行yyCtrlC复制多行nyyShift 方向键→CtrlC粘贴pCtrlV删除当前行ddShift Home→Delete删除多行nddShift 方向键→Delete删除当前字符xDelete删除前一个字符XBackspace撤销uCtrlZ重做CtrlRCtrlY查找当前单词*CtrlF继续查找nEnter跳到文件开头ggCtrlHome跳到文件末尾GCtrlEnd跳到行首^Home跳到行尾$End向前移动一个单词wCtrl→向后移动一个单词bCtrl←进入插入模式i直接输入光标后进入插入模式a直接输入新开一行并进入插入模式oEnd→Enter替换字符r直接输入新字符连续替换RInsert切换大小写~手动修改块选择Ctrlv鼠标按列拖选块选择后批量插入I多行同时输入退出当前模式EscEsc末行模式命令保存:wCtrlS退出:qAltF4保存并退出:wqCtrlS→AltF4不保存强制退出:q!关闭窗口且不保存显示行号:set nu—取消行号:set nonu—执行 Linux 命令:!命令WinR→ 输入命令全文替换:%s/旧/新/gCtrlH垂直分屏:vs 文件名分屏窗口分屏切换Ctrlw批量注释【重点】ctrlv块选择按列选→ 2. 选中多行 → 3.shifti输入//→ 4.Esc应用到所有行。去注释ctrlv选中//→ 按d。配置文件/etc/vimrc全用户vs~/.vimrc当前用户。常用三行syntax on高亮、set nu行号、set shiftwidth4缩进 4。自带教程vimtutor。3. 编译器 gcc/ggcc,g大部分选项是一样的讲解以gcc为主gcc——C语音g——C这里关于程序编译的内容之前已经讲过了这里稍微复习一下。编译四阶段【复习】阶段工作产物选项记忆预处理宏替换、删注释、条件编译、展开头文件.i-E只改文本编译翻译成汇编代码.s-S还是文字汇编翻译成机器码.o目标文件-c不链接链接合并 .o 库代码可执行程序无默认补 printf 等记忆选项依次是ESc(键盘右上角的退出键和iso一般先编译成.o在编译成可执行程序-E -S -c都默认前面的命令已经执行了代码示例gcc-chello.c-ohello.o# .c → .o预处理 编译 汇编gcc hello.o-ohello# .o → 可执行文件链接./hello# 运行当前目录下的可执行文件############################################gcc hello.c-ohello# 一步完成预处理 → 编译 → 汇编 → 链接./hello# 运行当前目录下的可执行文件条件编译预处理的本质就是修改我们的文本代码而不是生成机器码。有时同一份源代码需要根据不同版本保留不同功能。例如专业版包含收费功能普通版不包含或者内核根据硬件情况裁剪功能。条件编译就是根据条件决定哪些代码参与编译。示例文件feature.c#includestdio.hintmain(void){#ifdefPRO版printf(professional feature\n);#elseprintf(basic feature\n);#endifreturn0;}不定义宏时gcc feature.c-ofeature ./feature#输出basic feature编译时通过命令行定义宏gcc -DPRO版 feature.c-ofeature ./feature#输出professional feature命令行宏定义的语法是gcc-DM源文件-o目标文件 gcc-DM100源文件-o目标文件-DM定义宏M相当于在代码中写#define M。-DM100定义宏M并令它的值为100相当于写#define M 100。3-3 动态链接和静态链接多文件编译一个大型程序通常不写在一个文件中而是分成多个源文件。每个源文件可以单独编译成.o目标文件最后再统一链接。例如gcc-cmain.c-omain.o gcc-cmath.c-omath.o gcc main.o math.o-oapp流程如下main.c → main.o ┐ ├→ 链接 → app math.c → math.o ┘这样修改math.c时只需重新生成math.o不必重新编译没有变化的main.c。静态链接静态链接是指在生成程序时把需要的库代码直接复制进可执行程序。它的优点是程序运行时不需要再寻找外部库运行环境更独立库代码已经放入程序运行时通常更直接。它的缺点是多个程序都使用同一份库时每个程序都保存一份副本浪费磁盘空间和内存库更新后已经生成的程序不会自动获得新库通常需要重新链接甚至重新编译所有程序。动态链接动态链接是指程序运行时才加载需要的库。库代码不直接复制到每个程序中而是由多个程序共同使用。查看程序依赖哪些动态库ldd helloldd是查看动态链接依赖的命令。输出中通常会看到类似libc.so.6 /lib64/libc.so.6printf的具体实现就在 C 标准库的动态库libc.so.6中。gcc链接程序时会根据需要去系统库目录中寻找它常见目录包括/usr/lib或/lib64。这就是链接的作用之一找到程序所需的外部代码并记录或合并它们。动态链接把公共库留在系统中程序运行时再加载静态链接则在生成程序时把库代码复制进去。一般都是使用动态链接3-4 静态库和动态库静态库.a静态库是提前打包好的代码集合文件后缀通常是.a。进行静态链接时库中被需要的代码会被复制到可执行文件中。静态库 .a 目标文件 .o ↓ 链接 可执行程序程序生成后即使删除这个静态库程序通常仍然可以运行因为所需代码已经被放进可执行文件。动态库.so动态库也是提前准备好的公共代码集合文件后缀通常是.so。进行动态链接时库代码不会全部复制进可执行文件而是在程序运行时才加载。可执行程序 动态库 .so ↓ 运行时加载 程序运行gcc默认使用动态链接。也就是说直接执行gcc hello.c-ohello通常会生成依赖动态库的程序。Windows 中对应的常见文件类型是LinuxWindows动态库.so动态库.dll静态库.a静态库.lib动态链接 vs 静态链接【易混】【重点】对比项动态链接静态链接库代码位置运行时从.so加载生成时复制进程序程序体积小大外部依赖依赖库缺失就挂网吧关门不依赖电脑买回家多程序共享共享一份省内存磁盘各自一份副本库更新换库即生效需重新链接gcc 默认是加-static库后缀Linux 动态.so/ 静态.aWindows 对应.dll/.lib。【易忘】本质动态链接 多程序共享内存中同一份公共代码。其他常用选项暂时不讲仅了解选项功能-o指定输出文件名-g加调试信息gdb 调试必需【重点】-static静态链接-shared生成动态库-O0~-O3优化级别O0 不优化便于调试-w/-Wall关警告 / 开常用警告推荐 -Wall-DM/-DM100命令行定义宏等价#define M用于条件编译、功能裁剪【易忘】验证与静态链接准备# 查看可执行文件类型以及是否为动态链接filehello# 动态链接通常会显示dynamically linked# 静态链接通常会显示statically linked# 查看动态链接依赖的 .so 共享库ldd hello# 动态程序列出依赖的共享库# 静态程序通常显示 not a dynamic executable静态链接方式gcc -staticgcc-statichello.c-ohello验证链接方式使用file查看文件基本信息filehello本系统是自带了静态库就是默认安装好了没有安装的可以使用命令# 如果需要完整的 GCC 静态链接环境可检查系统是否提供对应静态库ls/usr/lib/x86_64-linux-gnu/libc.a# c静态库ls/usr/lib/gcc/x86_64-linux-gnu/*/libstdc.a# c静态库# 安装命令如下# Ubuntu / Debian # 安装静态链接所需的 C/C 静态库sudoaptupdatesudoaptinstall-ylibc6-dev libstdc-11-dev# CentOS / RHEL # 静态链接前安装 C/C 静态库sudoyuminstall-yglibc-static libstdc-static报错cannot find -lc 找不到 C 标准库的静态版本 → 装glibc-static。下期预告基础开发工具中——makefile、进度条、git结语本文到此结束感谢大家的阅读如果觉得本文对你有所帮助欢迎点赞、收藏、关注也欢迎在评论区一起交流讨论。也欢迎订阅我的深入理解 C系列从语法入门到底层原理系统掌握现代 C算法系列从入门到精通蓝桥杯、ACM、LeetCode 与面试算法全路线快速复习系列知识梳理、查漏补缺考前冲刺必备Linux系列从零带你系统学习Linux系统深入理解计算机组成原理愿每一次敲下键盘都比昨天更进一步愿每一行代码落下都让未来多一种可能