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

动态库与静态库:深入解析与应用

在软件开发中,库(Library)是预编译的代码集合,用于在多个程序之间共享功能。根据链接方式的不同,库主要分为两种类型:静态库(Static Library)动态库(Dynamic Library)。本文将深入探讨这两种库的区别、优缺点以及它们在实际开发中的应用。


目录

一、静态库(Static Library)

1. 静态库的工作原理

2. 静态库的优点

3. 静态库的缺点

4. 静态库的使用场景

二、动态库(Dynamic Library)

1. 动态库的工作原理

2. 动态库的优点

3. 动态库的缺点

4. 动态库的使用场景

三、静态库与动态库的比较

四、如何选择静态库或动态库

五、实际开发中的应用

1. 创建静态库

2. 创建动态库

3. 使用库

六、总结


一、静态库(Static Library)

静态库 是一种在编译时被链接到目标代码中的库。它通常以 .a 文件(在 Unix/Linux 系统中)或 .lib 文件(在 Windows 系统中)的形式存在。

1. 静态库的工作原理
  • 静态库在程序编译时被链接到目标代码中。

  • 链接器(Linker)会将静态库中的代码片段直接嵌入到可执行文件中。

  • 因此,生成的可执行文件是自包含的,不再依赖于外部库文件。

2. 静态库的优点
  1. 独立性:生成的可执行文件是独立的,不需要额外的库文件支持。

  2. 性能优势:由于代码直接嵌入到可执行文件中,运行时不需要加载额外的库,因此启动速度更快。

  3. 兼容性:静态链接避免了动态库版本冲突的问题,适合在不同环境中运行。

3. 静态库的缺点
  1. 体积较大:由于库代码被嵌入到每个可执行文件中,生成的文件体积较大。

  2. 更新困难:如果库代码需要更新,必须重新编译所有依赖该库的程序。

  3. 内存占用:每个程序都会加载自己的库代码副本,导致内存占用增加。

4. 静态库的使用场景
  • 嵌入式系统:由于嵌入式设备资源有限,静态库可以减少对动态库的依赖。

  • 独立程序:对于不需要频繁更新的程序,静态库可以确保程序的独立性和稳定性。


二、动态库(Dynamic Library)

动态库 是一种在运行时被加载的库。它通常以 .so 文件(在 Unix/Linux 系统中)或 .dll 文件(在 Windows 系统中)的形式存在。

1. 动态库的工作原理
  • 动态库在程序运行时被加载到内存中。

  • 链接器在运行时解析库中的符号,并将它们映射到程序中。

  • 动态库的代码在内存中共享,多个程序可以同时使用同一个库实例。

2. 动态库的优点
  1. 体积小:可执行文件中不包含库代码,因此体积较小。

  2. 易于更新:库代码独立于可执行文件,更新库文件后,所有依赖该库的程序都会自动受益。

  3. 内存共享:多个程序共享同一个库实例,节省内存。

3. 动态库的缺点
  1. 依赖问题:程序运行时需要确保动态库存在且版本正确,否则可能导致程序无法运行。

  2. 性能开销:运行时加载和解析库代码会带来一定的性能开销。

  3. 安全性问题:动态库可能被恶意替换或篡改,导致安全问题。

4. 动态库的使用场景
  • 大型软件系统:如操作系统、数据库等,动态库可以减少内存占用并便于更新。

  • 插件系统:动态库允许程序在运行时加载和卸载插件,增强系统的灵活性。


三、静态库与动态库的比较

特性静态库(Static Library)动态库(Dynamic Library)
链接时间编译时链接运行时链接
文件大小可执行文件较大可执行文件较小
更新方式需要重新编译程序只需更新库文件
内存占用每个程序占用独立的库副本多个程序共享同一个库实例
依赖性无运行时依赖需要确保库文件存在且版本正确
性能启动速度快启动速度稍慢,但运行时性能较好
安全性更高,代码嵌入可执行文件中存在被篡改的风险

四、如何选择静态库或动态库

选择静态库还是动态库取决于具体的应用场景和需求:

  1. 独立性优先

    • 如果程序需要在不同的环境中运行,且不需要频繁更新,静态库是更好的选择。

    • 例如,嵌入式系统和独立的桌面应用程序适合使用静态库。

  2. 灵活性和更新性优先

    • 如果程序需要频繁更新,或者需要支持插件系统,动态库是更好的选择。

    • 例如,操作系统、大型软件框架和插件式应用程序适合使用动态库。

  3. 内存和性能优化

    • 如果程序需要节省内存,且对启动速度要求不高,动态库更适合。

    • 例如,多用户环境下的服务器应用程序适合使用动态库。


五、实际开发中的应用

1. 创建静态库

在 Linux 系统中,可以使用 ar 工具创建静态库:

# 编译源文件
gcc -c file1.c file2.c
# 创建静态库
ar rcs libmylib.a file1.o file2.o

在 Windows 系统中,可以使用 Visual Studio 的项目设置生成 .lib 文件。

2. 创建动态库

在 Linux 系统中,可以使用 gcc 创建动态库:

# 编译源文件
gcc -fPIC -c file1.c file2.c
# 创建动态库
gcc -shared -o libmylib.so file1.o file2.o

在 Windows 系统中,可以使用 Visual Studio 的项目设置生成 .dll 文件。

3. 使用库
  • 静态库:在编译时链接静态库。

    gcc main.c -L. -lmylib -o main
  • 动态库:在运行时加载动态库。

    gcc main.c -L. -lmylib -o main
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    ./main

六、总结

静态库和动态库是软件开发中两种重要的库类型,各有优缺点。静态库在编译时链接,生成的程序独立且启动速度快,但体积较大且更新困难。动态库在运行时加载,生成的程序体积小且易于更新,但存在依赖问题和一定的性能开销。选择哪种库类型取决于具体的应用场景和需求。

在实际开发中,开发者可以根据项目的特性灵活选择静态库或动态库,甚至在同一项目中同时使用两者,以达到最佳的开发效果。


相关文章:

动态库与静态库:深入解析与应用

在软件开发中,库(Library)是预编译的代码集合,用于在多个程序之间共享功能。根据链接方式的不同,库主要分为两种类型:静态库(Static Library) 和 动态库(Dynamic Library…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D,函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机(一台 LVS、两台 RS、一台客户端) 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机(两块网卡) 第一块:NAT模式(内网) 第二块:添加网卡&am…...

MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制

在matlab APPdesigner中绘图可以用UIAxes组件进行绘图,但是当想多张图时,只能提前绘制图像区域不方便。下面是几种办法: 为了操作可以添加Panl组件,方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数: til…...

9种慢慢被淘汰的编程语言...

技术不断进步,我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响,我们更加关注哪些语言将在未来继续流行,哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场,而其他一些语言则逐…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...

UE_C++ —— Metadata Specifiers

声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词&#xff0c;表示其与引擎和关卡编辑器诸多方面的互动方式&#xff1b; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时&#xff0c;可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…...

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器&#xff0c;用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全&#xff1a; 一、安装Tomcat 下载 访问Apache Tomcat官方网站&#xff08;https://tomcat.apache.org/&#xff09;&#xff0c;根据你的操作系统&#xf…...

每日Attention学习23——KAN-Block

模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...

今日写题04work

题目&#xff1a;移除链表元素 两种实现思路 思路一 使用双指针&#xff0c;prev&#xff0c;cur快慢指针解决。当cur不等于val&#xff0c;两个指针跳过。当等于val时&#xff0c;要考虑两种情况&#xff0c;一种是pos删&#xff0c;一种是头删除。 pos删除就是正常情况&am…...

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...

LeetCode541 反转字符串2

一、题目描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。具体规则如下&#xff1a; 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等…...

MAC 系统关闭屏幕/睡眠 后被唤醒 Wake Requests

问题&#xff1b;查看wake 日志 pmset -g log | grep "Wake Requests" 为 Wake Requests [*processdasd requestSleepService...info"com.apple.alarm.user-invisible-com.apple.calaccessd...电源设置命令参考&#xff1a; pmset -g sched //查看定时…...

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家&#xff08;SMoE&#xff09;可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B&#xff0c;表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低&#xff08;下图左&#xff09; 在优化时只有一小部分专家会被…...

vue和Django快速创建项目

一、VUE 1.创建 Vue 3 JavaScript 项目 npm create vitelatest 项目名称 -- --template vue创建 Vue 3 TypeScript 项目 npm create vitelatest 项目名称 -- --template vue-ts 2.然后 cd 项目名称 npm install npm install axios # 发送 API 请求 npm install pinia …...

Java LinkedList(单列集合)

LinkedList 是 Java 中实现了 List 接口的一个类&#xff0c;它属于 java.util 包。与 ArrayList 不同&#xff0c;LinkedList 是基于双向链表实现的&#xff0c;适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现&#xff1a;LinkedList 使用双向…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种&#xff0c;一种是继承Thread&#xff0c;一种是实现Runable 在这里推荐使用实现Runable接口&#xff0c;因为java是单继承的&#xff0c;一个类继承了Thread将无法继承其他的类&#xff0c;而java可以实现多个接口&#xff0…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...