【知识讲解】 Linux之动静态库的了解
目录前言Part1. 库的意义Part2. 静态库制作、编译与发布Part2.1. 静态库制作步骤Part2.2. 使用静态库编译业务代码Part2.3. 静态库的打包分发Part2.4. Makefile 自动化构建静态库、一键打包发布Part3. 动态库制作、编译、部署Part3.1. 动态库制作Part3.2. 编译业务程序链接动态库Part3.3. 解决运行时找不到动态库的方案Part3.4. 强制链接静态库Part4. 静态库与动态库对比Part5. 补充拓展Part6. 结语前言Linux下对于动静态库的认识是非常重要的接下来来跟随小编的视角来看看吧。lets go!!!!!!!!Part1. 库的意义在工程开发中我们会把可复用的功能封装成库不需要每次都重新编译源码。• 源码不需要对外交付只需要交付头文件.h用于给用户声明函数 库文件.a / .so存放编译好的机器指令•多个项目可以复用同一套库大幅减少重复编译的成本• 版本迭代时只需要更新库文件业务代码无需改动补充目标文件 .o 的价值一个大型工程有上百个 .c 文件如果只修改其中一个源码只需要重新编译这一个文件生成 .o其余目标文件可以直接复用避免全量重新编译节省编译时间。编译链路.c → 编译生成 .o可重定位目标文件ELF格式 → 链接 → 可执行程序 / 库底层小知识.o、静态库、动态库、可执行程序全部都是ELF格式。ELF内部由大量的section段组成代码段、数据段、只读段等运行时操作系统会把多个section合并为segment段分区映射到进程的虚拟地址空间。Part2. 静态库制作、编译与发布静态库后缀命名规范libxxx.a比如我们示例库名字为 libmyc.aPart2.1. 静态库制作步骤1. 先把源码编译为目标文件 .o# -c只编译不链接生成 *.o gcc -c 1.c -o 1.o gcc -c 2.c -o 2.o2. 使用 ar 工具打包多个 .o归档成为静态库 .a# ar -rc r插入/替换c创建归档文件 ar -rc libmyc.a 1.o 2.oar 本质就是一个归档工具把一堆 .o 打包成一个文件静态库本身就是一堆目标文件的压缩包gcc链接的时候会把库里面用到的目标代码直接拷贝进最终的可执行文件。Part2.2. 使用静态库编译业务代码假设业务代码 main.c 需要调用我们静态库里面的函数。编译链接语法gcc -o exe main.c -I ./include -L ./mylib -l myc参数解释参数 作用-I路径 指定头文件搜索路径用来找到 .h-L路径 指定库文件.a/.so的搜索路径-lxxx 链接名为 libxxx.a / libxxx.so 的库自动补全lib前缀和后缀Part2.3. 静态库的打包分发我们交付给用户的时候不需要交付 .c 源码只需要交付• include/存放 .h 头文件函数声明• mylib/存放编译好的 libmyc.a 静态库用户拿到之后有两种方式使用头文件1. 编译时通过 -I 指定头文件目录gcc -c main.c -I ./lib/include2. 或者直接把头文件拷贝到系统标准头文件目录 /usr/includecp lib/include/* /usr/include库文件拷贝到系统库目录 /usr/libcp lib/mylib/libmyc.a /usr/lib之后编译就可以简化不需要写 -I -L直接gcc -o exe main.c -l mycPart2.4. Makefile 自动化构建静态库、一键打包发布可以用Makefile自动化完成编译、打包、创建目录、打包压缩交付包libmyc.a: 1.o 2.o ar -rc $ $^ 1.o:1.c gcc -c $ -o $# 发布目标自动创建目录拷贝头文件、库打包tar压缩包.PHONY: output output: mkdir -p lib/include mkdir -p lib/mylib cp -f *.h lib/include cp -f libmyc.a lib/mylib tar -czf lib.tgz lib执行make output直接生成 lib.tgz这个压缩包就可以发给别人使用。静态库核心特点链接的时候代码直接复制进exe。一旦编译完成后续静态库文件就算删除程序依旧可以正常运行。Part3. 动态库制作、编译、部署动态库后缀.so命名示例 libmyc.so动态库不会把代码拷贝进可执行文件程序运行的时候操作系统才去加载 .so多个进程可以共享同一份动态库在内存中的副本节省内存。Part3.1. 动态库制作1. 编译目标文件必须带上 -fPIC生成位置无关代码gcc -fPIC -c 1.c -o 1.o gcc -fPIC -c 2.c -o 2.o-fPICPosition Independent Code 位置无关代码生成的机器指令没有硬编码绝对地址可以被加载到虚拟地址空间的任意位置是动态库的核心。静态库不需要 -fPIC。2. 使用 -shared 参数把 .o 链接打包为动态库 .sogcc -shared -o libmyc.so 1.o 2.oPart3.2. 编译业务程序链接动态库编译链接阶段语法和静态库几乎一模一样gcc -o exe main.c -I ./include -L ./mylib -l myc这里有一个非常经典的坑编译链接成功但是运行的时候报错找不到动态库原因-L 只是编译阶段告诉gcc去哪里找库程序运行阶段是操作系统去加载动态库和gcc已经无关了操作系统有自己一套动态库搜索路径。Part3.3. 解决运行时找不到动态库的方案方案1临时环境变量 LD_LIBRARY_PATHLD_LIBRARY_PATH 是Linux操作系统的动态库环境变量操作系统运行程序的时候会优先从这个变量记录的目录里面搜索 .so。# 临时生效当前终端窗口有效关闭终端就失效 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/xxx/lib/mylib ./exe方案2写入系统动态库配置文件永久生效Linux系统动态链接器会读取 /etc/ld.so.conf.d/ 下面的配置文件1. 在 /etc/ld.so.conf.d/ 新建一个配置文件随便命名例如 myconfig.conf写入我们动态库的绝对路径/home/xxx/lib/mylib2.更新动态链接器缓存ldconfig永久生效所有用户、所有终端都可以找到这个动态库方案3直接拷贝动态库到系统标准库目录/usr/libcp libmyc.so /usr/lib ldconfigPart3.4. 强制链接静态库如果你本身系统同时存在 .a 和 .sogcc默认优先链接动态库。如果你想要强制编译的时候使用静态库增加 -static 参数gcc -o exe main.c -I ... -L ... -l myc -staticPart4. 静态库与动态库对比特性静态库 .a动态库 .so链接时期编译链接阶段代码拷贝进可执行文件编译阶段只记录符号运行时操作系统加载程序体积可执行文件更大包含库代码可执行文件更小内存占用每个进程都有一份独立的库代码副本内存占用高内存中只加载一份多进程共享节省内存更新方式更新库业务代码必须重新编译链接替换 .so 文件即可不需要重新编译业务程序依赖编译完成后不再依赖原 .a 文件运行时必须保证 .so 存在否则程序无法启动工程选型Linux后端服务绝大多数场景优先使用动态库一些嵌入式、想要单文件交付、不想携带一堆so的场景会使用静态库。Part5. 补充拓展1. .o 可重定位目标文件编译产物还没有分配虚拟地址等待链接器完成地址重定位2. ELF 文件内部划分为很多 section.text代码段、.data数据段、.rodata只读段、.bss未初始化数据段3. 当程序被操作系统加载运行时内核会把多个section合并成segment内存段映射到进程独立的虚拟地址空间这就是进程的内存布局。Part6. 结语这篇文章我们深入的知道了动静态库的相关知识接下来小编还会带来更多Linux相关的知识敬请期待~最后祝大家可以春风得意马蹄疾一日看尽长安花最后的最后要是觉得本文还可以的话可以点点赞关注小编一波谢谢大家~

相关新闻

新质生产力与数据零件库建设:技术复用与研发复用的知识底座

新质生产力与数据零件库建设:技术复用与研发复用的知识底座

新质生产力与数据零件库建设:技术复用与研发复用的知识底座新质生产力强调“以人工智能引领科研范式变革”。AI要引领科研范式变革,需要数据底座和知识底座。没有数据底座,AI无法训练模型;没有知识底座,AI无法推理判断…

2026/10/12 3:57:23 阅读更多 →
C# 遍历(迭代)完全指南:for、foreach、while 怎么选?foreach 底层原理、集合遍历与增删坑一篇讲透

C# 遍历(迭代)完全指南:for、foreach、while 怎么选?foreach 底层原理、集合遍历与增删坑一篇讲透

C# 遍历(迭代)完全指南:for、foreach、while 怎么选?foreach 底层原理、集合遍历与增删坑一篇讲透遍历(也叫迭代),说白了就是"把一堆数据挨个访问一遍"。它是编程里最高频的操作之一&…

2026/10/12 3:57:23 阅读更多 →
后训练不等于微调:一文讲清大模型 Post-training、SFT、LoRA、DPO 和 RLHF

后训练不等于微调:一文讲清大模型 Post-training、SFT、LoRA、DPO 和 RLHF

摘要:预训练完成后,模型还远远谈不上“好用”。它可能会续写文本,却不一定听得懂指令;可能知道很多知识,却不会按照固定格式输出;甚至给出了正确答案,置信度也未必可信。把基础模型改造成聊天助…

2026/10/12 3:57:23 阅读更多 →

最新新闻

量子开发者人才缺口百万?入门技能图谱与实操路径全解析

量子开发者人才缺口百万?入门技能图谱与实操路径全解析

一份“2030年量子开发人才缺口达百万”的预测,最近在朋友圈被转得很猛。我第一反应是:这数字靠不靠谱先放一边,“量子开发者”到底是个什么工种,多数人其实说不清楚。作为写过几年经典软件、又花了不少时间钻进量子计算这个交叉领…

2026/10/12 4:44:49 阅读更多 →
闲置PS5变身标准媒体终端与测试机:AnyPS5配置指南

闲置PS5变身标准媒体终端与测试机:AnyPS5配置指南

把“AnyPS5”这个名字扔上来的时候,估计会有人下意识往越狱、固化那类方向想。我先把话说清楚:我这里的AnyPS5不是破解工具,也不是某个隐藏系统,而是我这段时间在工作室里把几台PS5翻来覆去折腾之后,沉淀出来的一套“任…

2026/10/12 4:44:49 阅读更多 →
Excel 关键指标 Top-N 高亮导出实战:SenseNova-Skills top-value-coloring 技能深度解析

Excel 关键指标 Top-N 高亮导出实战:SenseNova-Skills top-value-coloring 技能深度解析

AI 技能人工智能深度研究数据分析媒体生成 【免费下载链接】SenseNova-Skills Modular SenseNova skills for building AI-powered office assistants and productivity workflows 项目地址: https://gitcode.com/gh_mirrors/se/SenseNova-Skills 点击查看 免费下载…

2026/10/12 4:44:49 阅读更多 →
OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统

OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统

OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher …

2026/10/12 4:44:49 阅读更多 →
Claude Code + MCP 实操:从空文件夹到可玩 Unity 游戏的全自动开发闭环

Claude Code + MCP 实操:从空文件夹到可玩 Unity 游戏的全自动开发闭环

开年这几个月,AI 辅助编程的玩法算是彻底变天了。以前大家讨论的是"AI 能不能帮你写代码",现在的问题已经变成"AI 能不能直接替你完成一个独立开发者的全套工作流"。我今天想聊的,就是我最近反复折腾又实测过好几轮的完整…

2026/10/12 4:44:49 阅读更多 →
OpenClaw技能合集:从Clawdbot到Moltbot的Agent Skill精选与TaoToken接入实践

OpenClaw技能合集:从Clawdbot到Moltbot的Agent Skill精选与TaoToken接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:43:48 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →