静态链接库与动态链接库 详解

发布时间:2026/9/8 20:23:26

静态链接库与动态链接库 详解
前言在软件开发中库Library是预先编译好的可重用代码集合开发者可以将其直接集成到自己的程序中从而避免从零开始编写所有功能。据链接方式的不同库主要分为静态库和动态库两大类。理解它们的原理和区别对于开发高效、可维护的软件至关重要目录一、静态库二、动态库三、库的链接过程3.1 静态链接过程3.2 动态链接过程四、适用场景一、静态库概念静态库是指在程序编译链接阶段将库代码直接嵌入到最终生成的可执行文件中的一种库形式。其扩展名在Windows平台通常为.lib在Linux平台为.a。静态库可以看作是一组目标文件.o或.obj的打包集合。链接时机静态链接发生在编译阶段程序生成可执行文件之前。这意味着程序在运行时不再依赖原始的静态库文件因为所需代码已经被完整地复制到了可执行文件中。优点部署简单无需担心依赖库的缺失启动快程序启动时无需额外加载外部库避免了动态加载可能带来的延迟。缺点文件体积大可执行文件包含了库的完整副本若多个程序静态链接相同的库容易造成代码冗余与资源浪费更新维护困难当库需要更新如 修复漏洞或升级功能时必须重新编译并发布所有使用该静态库的可执行文件。二、动态库概念动态库也叫共享库是指在程序运行时才被加载和链接的库。其扩展名在Windows平台为.dll在Linux平台为.so。与静态库不同动态库在编译链接阶段不会将库代码复制到可执行文件中而是只记录库的引用信息如库文件名和函数符号。链接时机动态链接推迟到程序运行阶段进行。当程序启动或运行过程中需要调用库函数时操作系统会负责加载对应的动态库文件并将其映射到进程的地址空间。多个进程可以共享内存中同一动态库的副本从而实现代码共享。优点节省存储资源多个程序可以共享同一份动态库便于更新维护当库需要更新时只需替换旧的动态库文件即可所有使用该库的程序无需重新编译。缺点存在依赖性风险如果目标环境缺少所需的库文件或版本不兼容程序将无法正常运行启动稍慢程序启动时需要加载动态库并解析函数地址这在一定程度上会略微增加启动时间。三、库的链接过程3.1 静态链接过程静态链接的核心任务是将多个目标文件和库文件合并为可执行文件主要步骤包括符号收集、符号解析和重定位。1) 符号收集链接器首先扫描项目自身编译出来的所有.o文件构建一个未解析符号表比如发现代码里调用了void func1()但当前.o里没有它的实现2) 符号解析链接器打开静态库.a文件。注意它不会把整个静态库塞进你的程序。它会去静态库的索引里查找只有当某个.o文件正好提供了未解析的符号时才会把那个.o文件提取出来。3) 合并与重定位将提取出的.o文件与你自己的.o文件合并分配虚拟内存地址把所有的函数调用地址修正为绝对地址。最终输出一个完整的可执行文件程序运行时完全不需要静态库的存在因为它已经被内化了。3.2 动态链接过程动态链接过程相对较复杂分为两个阶段链接时与加载运行时。阶段一链接时在这个阶段链接器不会拷贝动态库的代码也不会分配最终地址。它只做标记和打桩。符号验证链接器检查动态库的导出符号表确认你调用的函数如void bar()在这个.so里确实存在。如果不存在直接报错拦截。记录依赖在你的可执行文件的头部的.dynamic段里写下一行类似的记录本程序运行时需要加载xxx.so。生成 PLT 桩代码链接器不会让你的代码直接call bar而是生成一小段跳板代码叫PLT过程链接表。你的代码实际上是call PLT[bar]。阶段二加载运行时当你双击运行程序时真正的魔法才刚刚开始。这个工作由操作系统的动态链接器Linux 的ld-linux.so或是Windows 的ntdll.dll完成。加载映射操作系统读取可执行文件头发现依赖xxx.so于是把该动态库从硬盘加载到进程的虚拟地址空间中。由于动态库可能被多个进程共享操作系统通常会把它映射到一段随机的地址。填充 GOT全局偏移表动态链接器知道xxx.so被加载到了哪个具体地址它把这个真实地址填入一个叫GOT全局偏移表的数组中。延迟绑定核心技术为了加快程序的启动速度现代操作系统默认使用“延迟绑定”即将符号解析推迟到首次调用时而非程序启动时全部解析。┌─────────────────────────────────────────────────────────┐ 延迟绑定 vs 立即绑定 ├─────────────────────────────────────────────────────────┤ 延迟绑定默认 启动时GOT/PLT初始化为桩代码 → 程序立即执行 首次调用陷入动态链接器 → 解析符号 → 填充GOT → 后续直接跳转 代价首次调用稍慢后续与直接调用无异 立即绑定 启动时解析所有符号 → 填充所有GOT → 程序开始执行 代价启动慢内存占用多即使未使用的函数也解析四、适用场景在项目开发中选择静态库还是动态库需要综合考虑各种因素1) 适合静态库的场景独立部署目标运行环境未知或不可控需要确保程序能在没有额外依赖的系统上运行例如嵌入式设备、系统恢复工具等。性能敏感对程序启动速度或运行性能有极高要求希望避免运行时加载库带来的开销。避免兼容性问题希望程序行为不受系统中库版本变化影响确保程序长期稳定运行。2) 适合动态库的场景资源受限在内存或磁盘空间有限的环境中动态库允许多个程序共享同一份代码减少资源占用。频繁更新软件需要经常更新或补丁动态库可以独立于主程序进行更新无需重新编译和部署整个应用程序。模块化架构大型软件采用模块化设计各功能模块以动态库形式提供可以独立开发、测试和部署提高开发效率和系统灵活性。许可证要求某些第三方库的许可证要求以动态链接方式使用此时必须遵循动态链接方式。

相关新闻

使用 create-twenty-app 脚手架创建 Twenty 应用:从项目生成、OAuth 认证到首次同步的完整指南

使用 create-twenty-app 脚手架创建 Twenty 应用:从项目生成、OAuth 认证到首次同步的完整指南

2026/9/8 20:23:26

使用 create-twenty-app 脚手架创建 Twenty 应用:从项目生成、OAuth 认证到首次同步的完整指南 【免费下载链接】twenty The open alternative to Salesforce, designed for AI. 项目地址: https://gitcode.com/GitHub_Trending/tw/twenty 导读 Twenty 应用…

tiny11builder 精简 Windows 11 镜像构建:4 步从环境到 tiny11.iso

tiny11builder 精简 Windows 11 镜像构建:4 步从环境到 tiny11.iso

2026/9/8 20:23:26

tiny11builder 精简 Windows 11 镜像构建:4 步从环境到 tiny11.iso 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 想要一台干净的 Windows 11&#x…

Pathway 自定义 Python Connector 实战:用 `ConnectorSubject` 把 Twitter 等任意流式数据接入实时数据管道

Pathway 自定义 Python Connector 实战:用 `ConnectorSubject` 把 Twitter 等任意流式数据接入实时数据管道

2026/9/8 20:23:26

Pathway 自定义 Python Connector 实战:用 ConnectorSubject 把 Twitter 等任意流式数据接入实时数据管道 【免费下载链接】pathway Python ETL framework for stream processing, real-time analytics, LLM pipelines, and RAG. 项目地址: https://gitcode.com/G…

ESP32-S3端云协同AI架构:从语音唤醒到自主演进的工程实践

ESP32-S3端云协同AI架构:从语音唤醒到自主演进的工程实践

2026/9/8 21:03:28

1. 项目概述:一块开发板如何长出“感知-思考-表达”的神经网络 你手边那块不到百元的 ESP32-S3 开发板,表面看只是个带双核 Xtensa LX7、2.4GHz Wi-Fi Bluetooth LE、USB OTG 和丰富外设接口的微控制器——但它的真正价值,从来不在参数表里&…

从陶瓷工业百强看京尚“市场与品质双轮驱动”的实战逻辑

从陶瓷工业百强看京尚“市场与品质双轮驱动”的实战逻辑

2026/9/8 21:03:28

前段时间陶瓷行业圈子里最热闹的一件事,就是新一届全国陶瓷工业百强名单出炉。京尚这个品牌不仅稳稳上榜,还成了榜单里被反复提及的“双轮驱动”典型——市场和品质两头都抓得硬。我做这行十几年,见过太多企业要么拼命冲销量把品质丢了&#…

tiktoken 分词器完整指南:如何为 OpenAI 模型精确计算 token

tiktoken 分词器完整指南:如何为 OpenAI 模型精确计算 token

2026/9/8 21:03:28

tiktoken 分词器完整指南:如何为 OpenAI 模型精确计算 token 【免费下载链接】tiktoken tiktoken is a fast BPE tokeniser for use with OpenAIs models. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiktoken 调用 OpenAI API 前,你需要…

ROS2 Launch 文件完全指南:从手动多终端到一键启动与参数化复用

ROS2 Launch 文件完全指南:从手动多终端到一键启动与参数化复用

2026/9/8 21:03:28

1. 为什么你需要 Launch:从手动开终端的痛说起1.1 一个过来人脑中的"标准化痛苦"刚开始接触 ROS2 的人,大多经历过这样一段蹒跚期:装好了 Humble,跟着教程敲ros2 run turtlesim turtlesim_node,小乌龟出来了…

渔业目标检测数据集使用指南:标注诊断与YOLO实战

渔业目标检测数据集使用指南:标注诊断与YOLO实战

2026/9/8 21:03:28

简介:本资源是面向计算机视觉初学者与AI安全监控开发者的小型钓鱼行为检测专用数据集,聚焦于岸边钓鱼人员的识别与定位任务,适用于智能公园管理、水域保护及安防预警等实际场景。压缩包共2000个文件,含1000张JPG格式原始图像与100…

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃

2026/9/8 20:53:28

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 想让 PS3 光盘游戏在电脑上跑起来,还能在崩溃时定…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…