news 2026/2/14 2:53:54

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/2/6 12:13:51

实习面试题-JavaScript 面试题

1.JavaScript 有哪些数据类型?它们的区别是什么? JavaScript 有八种基本数据类型,分为原始类型(Primitive Types)和引用类型(Reference Types): 原始类型 1)Undefined:表示变量未初始化。一个变量声明后但未赋值时,它的默认值是 undefined。 2)Null:表示一个空…

作者头像 李华
网站建设 2026/2/9 7:21:46

解决‘此扩展程序不再受支持’问题:FLUX.1-dev开发环境兼容性优化方案

FLUX.1-dev开发环境兼容性优化:从问题到实践的深度解析 在浏览器插件开发的世界里,一个看似无害的提示——“此扩展程序不再受支持”——往往能让整个项目陷入停滞。尤其是当它出现在你基于最新AI模型构建的文生图工具中时,那种挫败感尤为强烈…

作者头像 李华
网站建设 2026/2/13 15:19:49

火山引擎AI大模型生态中FLUX.1-dev的独特定位分析

火山引擎AI大模型生态中FLUX.1-dev的独特定位分析 在AIGC浪潮席卷内容创作领域的今天,一个核心问题始终困扰着从业者:如何让AI真正“听懂”复杂的视觉指令?无论是广告设计师反复修改提示词却得不到理想构图,还是电商平台需要批量生…

作者头像 李华
网站建设 2026/2/5 21:08:47

抖音直播回放永久保存指南:告别内容丢失的烦恼

抖音直播回放永久保存指南:告别内容丢失的烦恼 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为错过精彩直播而懊恼吗?🤔 当你看到心仪主播的直播,想要永…

作者头像 李华
网站建设 2026/2/12 14:12:07

Bypass Paywalls Clean完整使用教程:快速解锁全网付费内容

Bypass Paywalls Clean是一款专为Chrome浏览器设计的强大扩展工具,能够智能绕过各类网站的付费墙限制,让您免费访问原本需要付费订阅的优质内容。无论您是新闻阅读者、学术研究者还是商业分析师,这款工具都能为您提供便捷的内容获取体验。 【…

作者头像 李华
网站建设 2026/2/10 15:39:23

国产CAD实现铸造与热处理工艺的标准化控制

铸造、热处理等特种工艺,其质量在很大程度上依赖于对过程参数(如温度、时间)的精确控制。过去,这些参数多依赖于老师傅的个人经验,存在波动性。为实现质量的稳定与均一,必须将个人经验转化为可重复、可验证…

作者头像 李华