news 2026/1/27 3:44:10

Linux 下静态库与动态库的制作与使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 下静态库与动态库的制作与使用详解

📚 Linux 下静态库与动态库的制作与使用详解(附优缺点对比)

在 Linux 系统中,程序开发常常需要复用代码模块。为了提高代码的可维护性和重用性,我们通常会将公共功能封装成库文件。常见的库分为两种:静态库(.a)动态库(.so)。本文将详细介绍它们的制作方法、使用方式,并对比各自的优缺点。


🔧 一、静态库(Static Library)

✅ 制作静态库

  1. 编译源文件为对象文件

    gcc calcufuncs.c -c -o calcufuncs.o

    -c表示只编译不链接,生成.o文件。

  2. 打包成静态库

    ar rcs libcalcufunc.a calcufuncs.o

    ar是归档工具:

    • r:插入或替换文件
    • c:创建新的归档文件
    • s:创建索引(加快链接速度)

    注意:库名必须以lib开头,.a结尾。


✅ 使用静态库

gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic
  • -lcalcufunc:告诉链接器要使用名为libcalcufunc.a的静态库(注意:-l后面不需要加lib.a)。
  • -L ./:指定查找库的路径,这里表示从当前目录查找。
  • 默认搜索路径为/usr/lib/usr/local/lib

⚠️ 编译成功后,最终的可执行文件mainProStatic中已经包含了所有静态库的代码,无需额外依赖。


✅ 发布说明

只需提供以下三个文件即可让使用者运行程序:

文件类型说明
.a文件静态库(保密核心逻辑)
.h文件头文件(声明函数接口)
可执行文件mainProStatic

💡 用户无需安装库,直接运行即可。


✅ 静态库特点总结

✔️ 优点:
  1. 加载速度快:库代码已打包进可执行文件,启动时无需额外加载。
  2. 移植方便:发布程序无需携带外部依赖,独立运行。
  3. 安全性高:源码不会暴露,仅提供二进制库。
❌ 缺点:
  1. 体积大:每个使用该库的程序都会复制一份代码,造成冗余。
  2. 更新麻烦:若库升级,需重新编译所有调用它的程序。
  3. 内存浪费:多个程序各自拥有相同代码副本,不能共享。

🔁 二、动态库(Shared Library)

✅ 制作动态库

第一步:编译源文件为位置无关的目标文件(.o)
gcc -c -fpic calcufuncs.c -o calcufuncs.o

注意:-fpic(或-fPIC)必须加在编译阶段,用于生成位置无关代码(Position Independent Code),这是动态库的要求。

第二步:将目标文件链接成动态库(.so)
gcc -shared calcufuncs.o -o libcalc.so

-shared告诉链接器生成一个共享对象(即动态库)。此时不需要再写-fpic,因为它只作用于编译阶段。


✅ 使用动态库

1. 编译阶段
gcc calculatorT.c -lcalcufunc -L ./ -o mainProDynamic
  • 语法同静态库,但此时链接的是.so文件。
  • 编译器只会记录对库的引用,不会复制代码。
2. 运行阶段

由于动态库不在系统默认路径中,需设置环境变量:

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH ./mainProDynamic

或者通过ldconfig将库添加到系统缓存(适用于全局部署)。


✅ 动态库典型应用场景

场景一:服务器编译 → 推送到嵌入式板子

假设你在服务器上编写了一个程序,使用了自定义动态库:

gcc test.c -lmylib -L./lib -o test

然后将testlibmylib.so一起拷贝到目标设备(如树莓派、工控板等)。

如果目标设备没有安装这个库,就会报错:

error while loading shared libraries: libmylib.so: cannot open shared object file

✅ 解决方案:

  • libmylib.so放到目标设备的/usr/lib/usr/local/lib下;
  • 或者在运行前设置LD_LIBRARY_PATH

🚀 更推荐的做法是:使用静态库,避免因缺少动态库导致运行失败!


✅ 动态库特点总结

✔️ 优点:
  1. 节省内存和磁盘空间:多个程序可共享同一份库文件。
  2. 易于升级:只需替换.so文件,无需重新编译应用程序。
  3. 支持热更新:程序运行期间可动态加载/卸载库。
❌ 缺点:
  1. 加载稍慢:运行时需动态加载并解析符号。
  2. 依赖管理复杂:必须确保库存在且版本兼容。
  3. 发布时需附带库文件:否则无法运行。

🔄 三、静态库 vs 动态库 对比表

特性静态库(.a)动态库(.so)
文件大小较大(代码复制)较小(只保留引用)
加载速度稍慢(运行时加载)
内存占用每个程序独占多个程序共享
更新维护困难(需重编译)简单(替换即可)
是否需要分发库否(已集成)是(需提供 .so)
安全性高(无源码暴露)中(可反向工程)
适用场景嵌入式、独立部署多程序共用、频繁更新

🛠️ 四、实战建议

  • 选择静态库

    • 当你需要打包一个完整、独立的可执行程序时(如嵌入式系统、跨平台部署)。
    • 不希望用户看到你的实现细节或防止逆向破解。
  • 选择动态库

    • 多个程序共享同一个功能模块(如图形界面组件、数据库驱动)。
    • 库频繁迭代升级,不想每次修改都重新打包整个应用。

📌 总结

类型核心思想关键命令使用方式
静态库编译期整合gcc -c,ar rcs-lxxx -L./
动态库运行时加载gcc -shared -fpic-lxxx -L./+ 设置LD_LIBRARY_PATH

💡一句话记住区别
静态库“打包进去”,动态库“运行时找”。


📌附加提示

  • 如果你想让动态库自动被系统识别,可以将其放入/usr/lib/usr/local/lib,然后运行:
    sudo ldconfig
  • 查看程序依赖的库:
    ldd mainProDynamic

🌟欢迎点赞收藏,关注我获取更多 Linux & C/C++ 开发干货!


✅ 本篇笔记基于实际项目经验整理,适用于初学者快速掌握 Linux 库的使用技巧,也适合开发者进行知识回顾与团队分享。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 1:15:08

终极指南:如何用layui-vue快速构建企业级管理系统

终极指南:如何用layui-vue快速构建企业级管理系统 【免费下载链接】layui-vue An enterprise-class UI components based on Layui and Vue. 项目地址: https://gitcode.com/gh_mirrors/lay/layui-vue 面对复杂的企业级应用开发,你是否曾为组件库…

作者头像 李华
网站建设 2026/1/22 20:12:45

用贪心算法解决仅含 6 和 9 数字的最大翻转值问题

一,创作灵感作为一名在校大学生,平时的算法学习中总觉得抽象的算法概念很难落地,直到遇到这个仅由 6 和 9 组成的数字翻转问题。起初我还在纠结要不要枚举所有翻转情况再找最大值,但转念一想,枚举的方式不仅麻烦&#…

作者头像 李华
网站建设 2026/1/23 13:48:35

git commit规范在vLLM项目开发中的最佳实践

vLLM 高性能推理开发中的 git commit 规范实践 在当前大模型应用爆发式增长的背景下,如何高效、稳定地部署 LLM 服务已成为工程团队的核心挑战。像 LLaMA、Qwen、ChatGLM 这类百亿级参数模型一旦投入生产环境,对吞吐量和显存利用率的要求极为严苛。传统推…

作者头像 李华
网站建设 2026/1/23 0:12:15

RAG面试通关秘籍:28个高频问题深度解析,建议收藏!

这篇文章系统梳理了RAG技术的28个高频面试问题,涵盖基础认知、常见问题、高级机制、RAG-Fusion、优化策略及未来展望。内容涉及RAG原理、与SFT的区别、内容缺失等问题的解决方案,以及RAG-Fusion工作机制和优化策略。文章还探讨了RAG的多模态、Agent自主检…

作者头像 李华
网站建设 2026/1/23 16:50:57

3分钟零代码:用Formily可视化设计器构建专业表单

还在为复杂表单开发而头疼吗?面对各种表单验证、布局调整和组件配置,传统的编码方式往往需要花费数小时甚至更长时间。现在,通过Formily可视化表单设计器,你可以在3分钟内完成专业级表单的搭建,完全无需编写任何代码。…

作者头像 李华