【Linux】基础开发工具(上)

一、软件包管理器

1. Linux下安装软件

  1. 下载软件的源代码,并进行编译,得到可执行程序。
    这种方式需要解决跨平台问题,以及需要手动解决多级依赖问题,一旦出现问题便很难解决,这对于普通用户来说,无疑是一种负担,一般不推荐。
  2. rpm包安装
    把Linux下的软件打成一个包,叫做rpm包,这种方式可能会遇到依赖问题,假设想下载A软件,但A软件可能依赖一些库,通过这种方式下载A软件,只会把A软件下载下来,依赖不会自动下载,遇到的依赖问题需要手动解决。比如想写C语言程序,需要依赖于C语言库,如果没有C语言库,程序就无法运行了。这种方式同样不推荐。
    在这里插入图片描述
  3. 包管理器
    例如:yum / apt,有人把一些常用的软件提前编译好,做成软件包(可以理解为手机上的安装包)放到一个服务器上,然后通过软件包管理器就可以很方便的下载安装好这个已经编译好的软件包。
    软件包和软件包管理器,就好比手机上的"APP"和"应用商店"。
    这种方法会全自动依赖解决:如安装 C 语言编译器gcc,包管理器会自动下载所需的 C 语言库(如libc)、编译工具链等。

强烈推荐普通用户优先使用第三种方法(包管理器,省时省力,避免依赖噩梦。),是最便捷、稳定的安装方式。
在这里插入图片描述

补充知识:操作系统的生态

什么样的OS(操作系统)是一个好的OS?答:生态好的OS,才是好OS。
OS 本身只是 “舞台”,生态中的应用开发者、硬件厂商、用户社群才是 “演员”。生态越繁荣,OS 的粘性和不可替代性越强。

假设我是一名公司老板,我不是非常懂技术,我想给公司选一个好的操作系统,我找到一个懂技术的员工,让他帮我推荐,并且给我一些可以让我理解的理由。假设我的员工给我推荐的系统是CentOS

作为公司老板,选择操作系统就像给公司选一个 “得力助手”,要考虑它靠不靠谱、花不花钱、好不好用。CentOS 就是这样一位 “全能型助手”,下面说说为什么推荐它:
一个好的操作系统,就像一个 “配套齐全的小区”—— 住的人多(用户多)、设施全(软件多)、物业好(支持强)、治安棒(安全高),住进去省心又舒服。CentOS 正是因为有这样的 “优质生态”,才适合作为公司开发的 “基础设施”(值得入住的好小区)。

  1. 很多大公司都在用 → 很多家庭选择的热门小区
    类比:
    一个地理位置优越、配套完善的小区会吸引很多家庭入住(就像大公司都选择 CentOS)。
    原因:大家都来入住,说明小区 “靠谱”(系统稳定)、“方便”(生态成熟)。
    好处:入住的家庭多(用户基数大),证明小区经过了真实生活的检验,潜在问题早就被发现并改进(如物业提前修好容易积水的路面)。
  2. 大公司使用暴露问题,减少排查成本 → 小区公共问题提前被解决
    类比:
    热门小区住的人多,难免会暴露问题(如电梯故障、停车位不足),但物业会快速响应并解决(就像 CentOS 社区修复漏洞)。
    好处:新入住的家庭(新用户)几乎不会遇到这些 “老问题”,即便遇到也能直接参考物业的 “问题处理手册”(社区文档),省时省力。
    例子:老住户发现小区周边早高峰堵车严重,物业协调开通了社区班车(类似 CentOS 优化网络配置),新住户直接享受解决方案。
  3. 活跃社区有解决文档 → 小区业主群的 “生活攻略”
    类比:
    小区业主群里总有热心业主整理 “生活攻略”:
    哪家超市送货快(软件库推荐);
    如何报修最有效(问题排查流程);
    楼道改造升级通知(版本变更说明)。
    对应 CentOS:社区里的工程师把常见问题解决方案写成文档(如《CentOS 网络配置故障排查指南》),新用户遇到问题时,直接在 “业主群”(论坛)里搜索关键词就能找到答案。
  4. 社区活跃,更新及时 → 小区物业定期升级设施
    类比:
    优质小区的物业会定期升级设施:
    加装智能门禁(系统安全更新);
    改造绿化景观(功能优化);
    引入快递柜、充电桩(支持新硬件 / 软件)。
    对应 CentOS:社区活跃意味着漏洞修复快、新功能迭代及时,就像小区紧跟科技趋势,让住户生活更安全、便捷。
  5. 完整文档,版本变更清晰 → 小区的 “历史规划档案”
    类比:
    小区开发商会留存详细的 “规划档案”:
    哪期工程增加了停车场(版本新增功能);
    哪年更换了供水管道(底层架构升级);
    对应 CentOS:官方文档清晰记录每个版本的变化(如 CentOS 7 vs 8 的差异),方便用户根据需求选择 “一期成熟小区”(稳定版)或 “二期新楼盘”(新版本)。
  6. 庞大用户群体帮忙解决问题 → 小区邻居的热心互助
    类比:
    小区里总有各行各业的热心邻居:
    退休电工帮忙修电路(资深工程师解决底层问题);
    宝妈分享育儿经验(新手互相交流);
    有人自发组织急救知识分享会(技术共享)。
    对应 CentOS:当你遇到罕见问题(如 “最近嗓子很疼,吃药也不好”),在业主群里提问,总有医生邻居结合自己的经验提供方案(如 “可以去某某医院看看,很权威”)。
  7. 丰富的软件库 → 小区周边的 “商业配套”
    类比:
    成熟小区周边有超市、医院、学校、健身房等 “一站式配套”(就像 CentOS 的软件库):
    想跑步?楼下就有健身房(安装开发工具一键完成);
    想买菜?生鲜超市步行 5 分钟(常用软件直接下载);
    甚至能找到 24 小时便利店(冷门工具也能快速获取)。
    对应 CentOS:开发需要的工具、库、框架都能在软件库中找到,无需到处 “跑腿”(手动编译或下载第三方安装包)。
  8. 稳定可靠,不耽误工作 → 小区的 “老牌物业”
    类比:
    CentOS 像一个服务了 10 年以上的老牌物业公司,管理着银行、商场所在的大型写字楼或高端小区。
    特点:
    24 小时在线值守:物业保安全年无休巡逻(类似系统 7×24 小时运行),电梯、水电等基础设施极少故障(系统稳定性高)。
    大机构信赖:银行用它管理金库安保系统,商场用它运行收银和监控系统(大公司用 CentOS 支撑核心业务)。
    例子:
    某小区物业连续 5 年零停电记录,住户开网店、做直播从不担心断网或设备故障(类似电商公司用 CentOS 处理数万笔订单无故障)。
  9. 安全性高,数据有保障 → 小区的 “智能安防系统”
    类比:
    CentOS 的安全机制相当于小区的三重智能安防体系:
    门禁系统(SELinux):
    只有业主刷脸 + 指纹才能进小区(类似 CentOS 的 “权限控制”,非授权程序无法随意访问核心数据)。
    陌生人想硬闯?保安立刻拦截(恶意软件攻击会被 SELinux 直接阻断)。
    定期安全升级(补丁更新):
    物业每月检查安防系统,发现漏洞立即修复(如升级监控摄像头分辨率、加密门禁系统数据),就像给系统 “打疫苗”。
    例子:某小区通过升级智能锁系统,一年内拦截了 12 起技术开锁盗窃企图(类似 CentOS 通过补丁修复漏洞,防止黑客入侵)。
    数据保险柜(加密存储):
    小区的快递柜有独立密码锁(类似 CentOS 的文件加密功能),个人快递信息不会被他人窃取(公司代码和用户数据安全有保障)。
  10. 免费又省钱 → 小区的 “公共设施免费用”
    类比:
    CentOS 就像公立小区,而 Windows Server 等收费系统像私立小区:
    私立小区:每年交高昂物业费(软件许可费),比如 100 户的小区年物业费 50 万(100 台服务器的 Windows 许可费约 30 万元)。
    公立小区(CentOS):
    基础服务免费:绿化、道路、路灯等公共设施维护费用由政府承担(开源免费,无需支付版权费)。
    省钱用途:省下的物业费可以给小区加装儿童乐园、老年活动中心(公司省下的钱可投入开发新功能、拓展业务)。
    对比案例:
    同地段的两个小区,公立小区住户用省下的物业费集体安装了电动车充电桩,而私立小区住户还在为 “是否要分摊充电桩费用” 吵架(类似企业用 CentOS 节省成本,快速推进项目)。

为什么选 CentOS?就像选 “省心小区”

CentOS 优势小区类比核心价值
大公司在用热门小区,入住率高经过检验,风险低
问题暴露早,排查成本低物业提前解决公共问题少走弯路,节省时间
社区活跃有文档业主群攻略齐全遇到问题随时可查,操作简单
更新及时物业定期升级设施安全有保障,功能与时俱进
用户群体庞大邻居热心互助再小众的问题也有人帮忙解决
软件库丰富周边商业配套齐全开发所需工具 “应有尽有”
稳定可靠10 年零重大故障的老牌物业保障业务连续运行,不耽误赚钱
安全性高智能门禁 + 定期安防升级保护公司数据和客户信息安全
免费省钱公立小区免交高昂物业费降低 IT 成本,省下来的钱能花在刀刃上

上面提到的这些就是操作系统的生态

简单来说,生态就像一个操作系统的 “朋友圈” 和 “资源库”,包括它能兼容的软件、能提供的服务、有多少人用它、遇到问题有没有人帮忙等等。

操作系统的不同,其实不是技术上的不同,本质上是生态 / 群体的不同,这个世界是人的世界,只要人 / 群体不同,那么配套的东西便不同 —— 技术只是载体,生态和群体需求才是核心驱动力
在这里插入图片描述

上面我们提到,是有人把一些常用的软件提前编译好,做成软件包后,才能通过yum / apt这样的包管理器进行下载,那么这些软件肯定都是由代码构成的,那么这些代码是谁写的呢?为什么有人会免费提供特定社区,提供软件,还发布?还提供云服务器让你下载?软件包服务器是个服务器,是需要用钱买的啊,钱是从何而来的呢?

在这里插入图片描述

  1. 代码是谁写的?
    程序员自己写的:
    有的是公司雇的程序员(比如谷歌工程师写安卓代码),有的是个人爱好者(比如学生课余写小程序),还有的是 “开源大佬”(比如 Linux 系统是 Linus 大神带着社区一起写的)。

  2. 为什么免费写?
    为了名气:写得好会被大厂看到,找工作更容易(比如在 GitHub 上秀代码)。
    公司让写的:比如华为开发鸿蒙系统,需要配套软件,程序员就会写开源软件吸引别人用鸿蒙。
    兴趣驱动:就像有人喜欢写小说、画画,有些程序员喜欢写代码分享给别人用。
    为了推广:这个开发者干脆就是那个写操作系统的人,他肯定不希望自己写的操作系统没人用。

  3. 为什么有人免费提供软件和服务器?
    软件免费的原因:
    推广系统:比如微软想让大家用 Windows,就配套开发免费的办公软件(早期 Office 免费试用)。
    开源理念:有些程序员觉得软件应该免费共享,比如 Linux 系统就是免费的,大家一起改进。

  4. 服务器费用谁出?
    大公司出钱:比如谷歌、亚马逊用开源软件赚钱,就会捐钱给开源项目(比如每年给 Linux 基金会捐几亿美金)。
    靠服务赚钱:虽然软件免费,但公司可以卖 “售后服务”(比如给企业定制功能、技术支持),用赚的钱养服务器。
    大家凑钱:小项目靠用户捐款(比如你用某个免费软件,觉得好用可以捐 10 块钱)。

举个简单例子:
比如安卓系统:
代码是谷歌和很多程序员一起写的,谷歌想让更多人用安卓手机,所以免费给手机厂商用。
手机厂商(比如三星、小米)用安卓系统卖手机赚钱,就会给谷歌交 “服务费”,或者内置谷歌的广告服务,谷歌用这些钱养服务器、维护系统。
还有很多程序员自己开发安卓 App(比如微信),免费给用户用,靠广告、会员赚钱。

一句话总结:
程序员写代码免费分享,可能是为了名气、公司任务或兴趣;大公司出钱养服务器,因为他们能通过软件生态赚钱(比如卖硬件、服务、广告),小项目就靠大家捐钱或自愿维护。
所以开源本质是一种商业模式,一个软件 / 操作系统 开源了,就有人用,就有人花钱。先用开源 “圈人”,再靠生态 “变现”。

补充知识:我的云服务器是怎么知道去哪找软件包的呢?

  1. 软件包查找的核心逻辑
    云服务器通过 配置文件 记录软件源地址,系统命令(如 apt install / yum install)会根据这些地址去下载软件包。
  2. 镜像源的作用
    国外服务器慢 / 不稳定:直接访问国外官方源(如 Ubuntu 官方源)速度慢,且可能受网络限制。
    国内镜像站:高校(如清华、中科大)和企业(如阿里云、华为云)会同步国外源的软件包到国内服务器,提供高速下载(镜像站 = 国外源的 “国内拷贝”)。
  3. 云服务商的定制
    默认替换为国内镜像:华为云、阿里云等会在系统初始化时,自动将软件源配置为自家镜像站(如华为云的 repo.huaweicloud.com),无需手动修改。
    优势:速度快、稳定,且部分云商可能对软件包做过兼容性优化(如适配自家云服务器硬件)。

在这里插入图片描述

2. 查看软件包

通过yum list指令可以罗列出当前一共有那些软件包,由于软件包的数目可能非常多,一般和grep指令搭配使用,筛选出我们关注的包。
在这里插入图片描述

3. 安装软件

查完如果存在就可以安装了:yum install -y sl
正常安装一个软件系统会询问是否进行安装,-y选项表示:是的,我要安装,-y可以在任意位置出现。
如果我们使用的是普通用户,我们会发现没有权限安装。
在这里插入图片描述
安装软件的本质是文件拷贝,是受到权限约束的。所以安装软件时,我们需要用root或者sudo提权
在这里插入图片描述
在这里插入图片描述
Linux下的软件,root安装了,其他人都可以用;一般而言,软件只要安装一次,其他人都能用。

4. 卸载软件

通过yum remove -y 某软件
在这里插入图片描述
卸载完成,无法执行sl指令
在这里插入图片描述

总结:关于yum安装 / 卸载软件

  1. root / sudo提权
  2. yum list | grep xxx,查看
  3. yum install [-y] xxx,安装
  4. yum remove [-y] xxx,卸载

需要注意一点,yum 安装软件只能串行安装,安装完一个软件才能安装下一个软件

5. 安装源

centos下安装源一般在/etc/yum.repos.d路径下
在这里插入图片描述

yum源一般分为两类,一个是稳定软件源,一个是扩展软件源。
稳定源(基础源):官方维护的核心软件包,如系统组件、常用稳定工具(如 CentOS 的 BaseOS、AppStream),适合生产环境。
扩展源(额外源):社区或第三方提供的非核心软件包(如 EPEL 源的 nginx、Docker 官方源),用于补充功能。
扩展软件源包含稳定软件源的新版本,部分的新版本在经过时间的验证后,会迁移到稳定源里。
在这里插入图片描述

二、编辑器Vim

vim是一个专注的编辑器,多模式的编辑器
vim的模式:
在这里插入图片描述
默认打开vim就是命令模式,命令模式是vim的核心和精华。命令模式存在的意义就是提高代码编写的效率。
注意:插入模式和底行模式是不能进行切换的,需要先切换到命令模式再做切换。
如果不知道自己所处什么模式,可以无脑esc键,再做切换,因为命令模式可以切换到任意模式。

1. 命令模式命令

光标移动命令:

  1. gg:光标定位到最开始
  2. shift + g = G:光标定位到最结尾
  3. 数字n + gg:光标定位到某行最开始
  4. 数字n + shift + g:光标定位到某行最结尾
  5. shift + 4 = $:光标定位到当前行末尾
  6. shift + 6 = ^:光标定位到当前行开头(内容的最开头,不包含空格)
  7. H(左键),J(下键,jump跳下去),K(上键,king高高在上),L(右键)
    我们现在的键盘不是有上下左右键吗,为什么要用HJKL呢?
    答:老式键盘里没有上下左右键。
    在这里插入图片描述在这里插入图片描述
  8. 数字n + w / b:光标以单词为单位进行前 / 后移动

其他命令:

  1. yy:复制当前行
  2. 数字n + yy:复制n行
  3. p:把复制的内容粘贴到当前行的下一行
  4. 数字n + p:粘贴n行
  5. u:撤销(undo)
  6. ctrl + r:反撤销,对u进行撤销
    注意:撤销和反撤销,在退出vim后再重新打开就无法操作了,不会保存关闭之前的历史操作,只要不退出vim就一直可以撤销操作。
  7. dd:剪切当前行,或者说是删除当前行(不再粘贴了,那不就是删除了嘛)
  8. n + dd:剪切n行
  9. x:删除光标所在字符
  10. n + x:向后删除n个字符,包括光标内的内容
  11. X:删除光标之前的一个字符
  12. n + X:删除光标之前的n个字符,不包括光标内的内容
  13. shift + ` (esc下面的按键)= ~:快速大小写转换
  14. n + r:向后选中包括光标在内的n个字符,(小范围文本选中,可以进行替换操作)
  15. shift + r = R:切换到替换模式,从现在开始,所有输入都替换原有内容
  16. a,i,o:从命令模式切换到插入模式,a切换到插入模式,并且光标向后移动一位;o切换到插入模式,并且新起一行,光标移动到下一行开头
  17. shift + zz:保存并退出vim

2. 底行模式命令

底行模式,需要从命令模式下按shift + ; = :键 切换到底行模式。

  1. w:保存
  2. q:退出vim
  3. wq:保存并退出vim
  4. !:表示强制操作,可以和上面三个操作合并
  5. set nu:设置行号
  6. set nonu:取消行号
  7. /关键词:从当前位置向下搜索包含 {关键词} 的内容。
  8. ?关键词:从当前位置向上搜索包含 {关键词} 的内容。
  9. n:跳转至下一个搜索结果(与 / 配合向下搜索时使用)。
  10. N:跳转至上一个搜索结果(与 ? 配合向上搜索时使用或反向导航)。
  11. !指令:临时执行 Shell 命令
  12. vs 文件名:分屏显示另一个文件,一般和 ctrl + ww 配合使用
    补充:ctrl + ww:光标切换到下一个文件(这个不算底行模式命令,但是适合在这里讲到)

3. 补充一些实用命令

3.1 ctrl + v

作用:切换到视图模式
可以直接从视图模式按shirf + i直接切换到插入模式

操作示例1,批量化注释操作:

  1. ctrl + v切换到视图模式

  2. hjkl选中目标区域
    在这里插入图片描述

  3. shift + i切换到插入模式

  4. //进行注释
    在这里插入图片描述

  5. Esc切换到命令模式,自动就批量化注释好了
    在这里插入图片描述

操作示例2,注释文件中全部内容如何操作?

  1. gg光标移动到最开始
  2. ctrl + v视图模式
  3. shift + g光标移动到最结尾
  4. shift + i切换到插入模式
  5. //注释
  6. Esc切换到命令模式,自动批量化注释
    在这里插入图片描述

操作示例3,批量化去注释:

  1. ctrl + v
  2. hjkl:选中区域,注意这里需要选中两列
  3. d:删除

事实上视图模式下,不止能进行注释操作,他本是上就是对文本的批量化编辑操作,批量化注释的本质就是批量化给文本加上//,实际上还可以加上任意内容,如下:
我在hello world中间批量化加上了hello,操作和刚刚类似,这里便不做赘述。
在这里插入图片描述

3.2 %s/原文本/新文本/

%s/原文本/新文本/[g],中括号代表可选项
把原文本替换成新文本,把前者替换成后者
g(global),在末尾加上g,就替换所有的原文本,不加的话默认只替换每行的第一个原文本

3.3 vim 文件名 + 行号

当gcc编译时,已经明显的知道错误在第几行,可以在打开vim时+行号,这样打开vim时光标自动跳转到目标行
例如:vim test.c +15
在这里插入图片描述
在这里插入图片描述

3.4 ! + 历史命令开始符

! + 历史命令的开始符:执行以开始符开头的最近的历史命令。

补充知识:修改vim配置文件

root用户下的vim配置一般不要修改,这里便不做讲解
在普通用户的家目录下,创建一个.vimrc 的隐藏文件,如果有就直接用
然后用vim打开.vimrc 文件,输入一些想要的配置即可,可以通过询问AI大模型生成,这里便不赘述。
也可以选择打开这个网址:https://gitee.com/HGtz2222/VimForCpp
可以在centos系统下自动化配置vim

三、编译器gcc / g++

1. 程序编译流程

  1. 预处理(进行宏替换 / 去注释 / 条件编译 / 头文件展开等)
    指令:gcc -E test.c [-o test.i],如果不加-o选项,输出结果直接打印到显示器上,不方便我们查看,带上-o选项,所有输出结果写入到文件test.i中去。

-E选项,表示,从现在开始进行程序的翻译,做完预处理便停下来
可以看到,test.c中的M在test.i中被替换成了6(宏替换操作),test.c中的注释在test.i中被去除了,test.c中的条件编译在test.i中也被处理了,而且预处理后的test.i一下子变成了800多行代码,这是因为预处理进行了头文件展开。从下图可以直观的看出以上这些变化。
在这里插入图片描述

  1. 编译(生成汇编)
    把C语言翻译成汇编语言
    -S选项,表示,从现在开始进行程序的翻译,做完编译,形成汇编,便停下来
    在这里插入图片描述

  2. 汇编(生成机器可识别代码)
    -c选项,表示,从现在开始进行程序的翻译,汇编完成,便停下来
    在这里插入图片描述
    此时test.o已经变成了二进制文件,但它并不能执行,test.o叫做可重定位目标二进制文件
    在这里插入图片描述

  3. 链接(生成可执行文件或库文件)
    把我们的.o 文件和库文件进行链接,才能形成可执行文件
    gcc test.o -o test
    把test.o与库文件进行链接,形成可执行文件
    在这里插入图片描述
    程序翻译的过程巧记,-ESc,和键盘上左上角的按键字母相同,只需要记住S是大写的就好了。
    文件后缀分别为.iso,和镜像文件的后缀是相同的

补充知识:sudo无法执行的问题

首先切换到root
在这里插入图片描述
更改root下的/etc/sudoers文件即可让普通用户拥有sudo提权的能力
在这里插入图片描述
可以:set nu设置一下行号,在大约100行的位置可以看到如下内容,复制一下root所在行,粘贴一下,将用户名改成你的普通用户名就可以了。
在这里插入图片描述

补充知识:理解条件编译

条件编译有什么用呢?
我们用过许多软件,例如爱奇艺,腾讯视频,再比如剪映,等等,这些软件都分为基础版和专业版,视频软件就是将用户分为普通用户和VIP用户。

那么这些公司在维护底层代码时,是维护一份代码还是两份代码呢,普通用户一份,VIP用户一份?
答案是:只维护一份代码,因为如果维护两份代码的话,当版本升级时所有的工作例如测试,更新代码,都需要进行双份工作,增加了人力。

那一份代码是如何做到区分两个版本的呢?
答案是:条件编译,条件编译通过预处理器指令(如 #ifdef、#if)在同一代码库中实现功能裁剪,是软件多版本维护的核心技术。这边是条件编译的作用之一。

2. 理解汇编

2.1 为什么不直接将C语言转成二进制?

gcc编译时,为什么要形成汇编语言,而不是直接将C语言翻译成二进制呢?
答案是,当然可以直接将C语言翻译成二进制,但是没必要,因为我们可以直接站在巨人的肩膀上。已经有人写了直接将汇编转成二进制的编译器,我们没必要再花费精力写一个将C语言转成二进制的编译器,直接利用前人写的汇编编译器,先将C语言转成汇编,再把汇编转成二进制就可以了。生成汇编代码作为中间步骤,使新编译器的后端只需关注 “高级语言→汇编” 的转换,这种分工提升了开发效率。

2.2 汇编语言是如何诞生的?

讲解汇编语言的诞生之前,先理解一个问题,是先有的编译器还是先有的语言?
答:先有的编译器,没有编译器,语言的诞生毫无意义。

在这里插入图片描述

2.3 编译器是如何自举的

在这里插入图片描述

例如,C语言的诞生:
在这里插入图片描述

3. 动静态库与动静态链接

上面我们提到了,可重定位目标二进制文件,也就是后缀为.o的文件是不可以直接执行的,需要链接库后才会形成可执行文件。
库被分为两类:动态库,静态库

  1. Linux中:
    动态库(libxxx.so)静态库(libxxx.a)
  2. Windows中:
    动态库(xxx.dll)静态库(xxx.lib)

库的名字一般是去掉前缀,去掉后缀的,例如:在这里插入图片描述,这便是C标准库的动态链接库。

补充知识:ldd指令

ldd 是 Linux 系统中的一个命令行工具,用于查看动态链接库(Dynamic Link Library,共享库)的依赖关系。
ldd 只能查看动态链接库(共享库)的依赖关系,无法检测静态链接库。

3.1 动态链接库

gcc 编译形成可执行程序,默认采用动态链接的方式
在这里插入图片描述
通过file指令查看可执行文件的链接方式
在这里插入图片描述

3.2 静态链接库

如果想采用静态链接方式,需要在指令末尾加上-static
例如:gcc test.c -o oks -static
采用静态链接形成的可执行程序的体积,明显比动态链接形成的可执行程序的体积大
在这里插入图片描述
通过ldd oks查看动态依赖发现:
oks可执行程序,不是一个动态可执行的,dynamic(动态的) executable(可执行的)在这里插入图片描述
通过file指令查看可执行文件的链接方式:静态链接的,statically(静态地)
在这里插入图片描述

3.3 无法采用静态链接方式

有的同学可能出现下面这种情况:
在这里插入图片描述
原因是因为系统没有装静态库,Linux环境一般默认只会存在动态库。
在这里插入图片描述
CentOS系统安装静态库:yum install glibc-static libstdc++-static -y,普通用户执行需要sudo提权

3.4 动静态链接的区别

  1. 动态链接:
    依赖方式:程序运行时才加载动态库(.so),通过动态链接器(如 ld-linux.so)查找并调用库中的代码。
    优点:
    节省磁盘空间:多个程序可共享同一个动态库。
    更新灵活:升级动态库后,所有依赖它的程序无需重新编译即可使用新功能。
    缺点:
    一旦丢失所有依赖动态库的程序都会运行出错。
  2. 静态链接:编译时直接将静态库(.a)中的代码拷贝整合到可执行文件中,形成独立文件。
    直接把需要的库方法拷贝到可执行程序中去。
    优点:
    环境独立性强:无需依赖目标机器的库文件,可直接运行
    调试简单:问题定位集中在可执行文件本身,无需考虑库版本冲突。
    缺点:
    体积庞大:每个可执行文件都包含库的完整代码,浪费磁盘空间(如多个程序依赖同一静态库时)。
    更新困难:若库代码修改,所有依赖它的程序都需重新编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值