news 2026/4/17 12:16:45

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/4/18 7:02:36

算法基础-(单调队列)

单调队列 1. 什么是单调队列? 单调队列,顾名思义,就是存储的元素要么单调递增要么单调递减的队列。注意,这⾥的队列和普通 的队列不⼀样,是⼀个双端队列。2. 单调队列解决的问题 ⼀般⽤于解决滑动窗⼝内最⼤值最⼩值…

作者头像 李华
网站建设 2026/4/18 5:23:24

轻松部署Qwen3-8B:结合ComfyUI打造可视化交互界面

轻松部署Qwen3-8B:结合ComfyUI打造可视化交互界面 在个人开发者和小型团队中,大语言模型的“可用性”往往比“参数量”更关键。你有没有遇到过这样的场景:好不容易跑通了一个开源LLM项目,却因为命令行调参太复杂,同事根…

作者头像 李华
网站建设 2026/4/18 7:01:04

GitHub Wiki搭建Qwen-Image中文文档社区

GitHub Wiki搭建Qwen-Image中文文档社区 在AIGC(人工智能生成内容)席卷创意产业的今天,文生图模型早已不再是实验室里的概念玩具,而是广告公司、设计工作室乃至独立艺术家手中实实在在的生产力工具。然而,一个现实问题…

作者头像 李华
网站建设 2026/4/17 23:30:10

HuggingFace模型卡解读:Qwen-Image性能指标全解析

HuggingFace模型卡解读:Qwen-Image性能指标全解析 在广告设计、电商运营和品牌传播等领域,高质量图文内容的生成效率直接决定市场响应速度。然而,当前主流文生图模型在面对中英文混合提示、复杂排版需求或精细修改任务时,常常出现…

作者头像 李华
网站建设 2026/4/18 8:55:02

Triton安装测试及实战指南

Triton入门教程:安装测试和运行Triton内核 文章标签:#人工智能 #深度学习 #python #英伟达 #Triton 技术定位与优势分析 Triton是一款开源的GPU编程语言与编译器,为AI和深度学习领域提供了高性能GPU代码的高效开发途径。它允许开发者通过Py…

作者头像 李华
网站建设 2026/4/18 3:37:56

模电基础:功率放大电路

目录 一、功率放大器的核心原理 二、功率放大电路常见分类及特点 (1)甲类功放 (2)乙类功放 (3)甲乙类功放 三、常见的功率放大器电路 (1)变压器耦合功放 &#xff0…

作者头像 李华