当前位置: 首页 > news >正文

-动静态库简单使用

1. 基本概念

1.1 静态库(Static Library)

静态库在编译时由链接器将库中的代码直接复制到可执行文件中。这意味着每个使用静态库的可执行文件都包含库代码的副本。

特点:

  • 独立性:可执行文件不依赖于外部库文件。
  • 加载速度:由于所有代码都已包含在可执行文件中,启动时无需加载额外的库文件。
  • 文件大小:可执行文件较大,因为包含了库代码的副本。

1.2 动态库(Dynamic Library)

动态库在运行时由操作系统加载,可执行文件仅包含对库的引用。多个程序可以共享同一个动态库,减少内存和磁盘空间的占用。

特点:

  • 共享性:多个程序可以共享同一个动态库,节省内存和磁盘空间。
  • 可维护性:动态库的更新不需要重新编译依赖它的可执行文件,只需替换库文件。
  • 加载速度:首次加载动态库时可能需要额外的加载时间,但后续调用可以利用操作系统的缓存机制。

2. 区别

2.1 链接时间

  • 静态库:在编译时链接,库代码被静态地复制到可执行文件中。
  • 动态库:在运行时链接,库代码在运行时由操作系统加载。

2.2 可执行文件大小

  • 静态库:可执行文件较大,因为库代码被包含在内。
  • 动态库:可执行文件较小,因为库代码在运行时加载。

2.3 更新与维护

  • 静态库:如果库代码有更新,所有使用该库的可执行文件都需要重新编译。
  • 动态库:只需更新动态库文件,所有使用该库的可执行文件无需重新编译即可使用新版本的库。

2.4 内存使用

  • 静态库:每个使用静态库的可执行文件都包含库代码,可能导致内存中有多份相同的代码。
  • 动态库:动态库代码在内存中只有一份,被多个进程共享,节省内存。

2.5 依赖性

  • 静态库:可执行文件不依赖于外部库文件,部署时更简单。
  • 动态库:可执行文件依赖于外部库文件,部署时需要确保库文件可用。

3. 优缺点

3.1 静态库的优缺点

优点:

  • 独立性:可执行文件不依赖于外部库文件,部署更简单。
  • 性能:没有运行时加载的开销,程序启动速度更快。
  • 兼容性:避免了动态链接可能带来的版本不兼容问题。

缺点:

  • 可执行文件较大:库代码被复制到可执行文件中,导致文件体积增大。
  • 内存使用:多个进程可能包含相同的库代码,浪费内存。
  • 更新困难:库代码有更新时,所有使用该库的可执行文件都需要重新编译。

3.2 动态库的优缺点

优点:

  • 可执行文件较小:库代码在运行时加载,减小了可执行文件的体积。
  • 内存共享:多个进程可以共享同一份动态库代码,节省内存。
  • 易于更新:只需更新动态库文件,无需重新编译可执行文件。

缺点:

  • 依赖性:可执行文件依赖于外部库文件,部署时需要确保库文件可用。
  • 运行时开销:加载动态库需要额外的运行时开销,可能影响启动速度。
  • 版本兼容性问题:不同版本的动态库可能导致兼容性问题。

4. 动静态库的实现

4.1 静态库的创建与使用

4.1.1 创建静态库(Linux)
// mylib.h
#ifndef MYLIB_H
#define MYLIB_Hvoid my_function();#endif
// mylib.c
#include "mylib.h"
#include<stdio.h>
void my_function() {printf("Hello from static library!\n");
}

2.编译源代码生成目标文件

3.创建静态库

  • ar:归档工具,用于创建静态库。
  • rcs:选项,表示替换、创建和生成索引。
  • libmylib.a:生成的静态库文件名。

 使用静态库

  • -L.:指定库文件搜索路径为当前目录。
  • -lmylib:链接libmylib.a库。

 4.2 动态库的创建与使用

 1.创建动态库(Linux):

这里直接使用静态库的代码。

2.编译源代码生成目标文件:

gcc -fPIC -c mylib.c -o mylib.o

 -fPIC:生成位置无关代码(Position-Independent Code),对于动态库是必需的。

3.创建动态库

 

  • -shared:创建共享库。

 4.使用动态库

直接使用会显示出ERROR,这是因为动态库的位置没有被找到,我们需要告诉操作系统链接的位置,我们可以配置环境变量来告诉其位置。

配置好后就可以运行了,当然还有其他方法,我这里就只举了这一个方法:

 

 希望这篇文章有助于你初步了解动静态库的使用,如果有错误还请指正。

http://www.xdnf.cn/news/677863.html

相关文章:

  • ABC 352
  • 依赖倒置原则 (Dependency Inversion Principle, DIP)
  • 分块查找详解
  • 第二章 1.3 数据采集风险的现有技术和解决方案
  • RK3568 OH5.1 镜像烧录
  • python第34天打卡
  • 深耕数字化赛道,联众优车以创新风控体系构筑汽车金融护城河
  • Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
  • AI智能分析网关V4垃圾桶满溢检测算法打造城市/公园/街道等场景应用方案
  • 浅谈Mysql的MVCC机制(RC与RR隔离级别)
  • LeetCode 1696. 跳跃游戏 VI(中等)
  • AI Agent开发第75课-数据、张量、流水线并行全解析
  • 【Web应用】若依:基础篇03-入门案例,若依代码生成器生成前后端代码
  • Web通信协议全景解析:从HTTP到WebService的技术演进与对比
  • 如何寻找大模型在企业业务中的价值?
  • Anaconda下载安装+配置虚拟环境保姆级教程(2025版)
  • 实时数仓flick+clickhouse启动命令
  • 第一个ASP.NET项目
  • 【Elasticsearch】retry_on_conflict
  • Python中while 1和while True有何区别?深入解析无限循环的写法选择
  • 百胜咨询公司:企业EcoVadis认证的专业导航者
  • SIGGRAPH 2025 | 快手可灵团队提出3D感知的电影级文本到视频生成框架CineMaster
  • 鸿蒙5开发宝藏案例分享---一多断点开发实践
  • 0527漏洞原理:SQL注入笔记 SQL注入类型(联合查询注入、报错注入实操)
  • 【本地部署】 Deepseek+Dify创建工作流
  • 【Vue 3 运行时 Diff 算法深度解析:五步走策略实现高效更新】
  • MySQL数据库第一章
  • 科技趋势分析系统 BBC (Big Bang of Computing)
  • mysql中的索引怎么用?
  • [特殊字符]《计算机组成原理》第 8 章 - CPU 的结构和功能