动态库、静态库、导入库
静态库、动态库与导入库详解
核心概念
| 类型 | 定义 | 文件扩展名 | 链接方式 | 运行时依赖 |
|---|---|---|---|---|
| 静态库 | 预编译代码集合,编译时嵌入可执行文件 | .lib (Windows)、.a (Linux/MinGW) | 直接链接到可执行文件 | 无 |
| 动态库 | 运行时加载的代码库,允许多程序共享 | .dll (Windows)、.so (Linux) | 运行时动态加载 | 需动态库文件 |
| 导入库 | 辅助链接器定位动态库符号的元数据文件(仅Windows) | .lib (MSVC)、.dll.a (MinGW) | 提供符号信息,无实际代码 | 需动态库文件 |
跨平台对比
Windows 系统
-
静态库
- 生成(MSVC):
cl /c mylib.c # 生成.obj lib /out:mylib.lib mylib.obj # 生成.lib静态库 - 生成(MinGW):
gcc -c mylib.c -o mylib.o # 生成.o ar rcs libmylib.a mylib.o # 生成.a静态库 - 使用: 直接链接到可执行文件,无需运行时文件。
- 生成(MSVC):
-
动态库
- 生成(MSVC):
cl /LD mylib.c /Fe:mylib.dll # 生成.dll和.lib导入库 - 生成(MinGW):
gcc -shared -o mylib.dll mylib.o -Wl,--out-implib,libmylib.dll.a - 使用: 链接对应的导入库(
.lib或.dll.a),运行时需mylib.dll在PATH或同级目录。
- 生成(MSVC):
-
导入库
- MSVC生成
.lib,MinGW生成.dll.a。仅用于编译时符号解析,不含实际代码。
- MSVC生成
Linux 系统
-
静态库
- 生成:
gcc -c mylib.c -o mylib.o ar rcs libmylib.a mylib.o - 使用: 直接链接,生成独立可执行文件。
- 生成:
-
动态库
- 生成:
gcc -fPIC -c mylib.c # 位置无关代码 gcc -shared -o libmylib.so mylib.o - 使用: 编译时链接
.so,运行时需设置LD_LIBRARY_PATH或标准库路径。
- 生成:
关键区别
| 特性 | 静态库 | 动态库 | 导入库(Windows) |
|---|---|---|---|
| 内容 | 实际代码 | 实际代码 | 符号信息(无代码) |
| 链接时机 | 编译时嵌入 | 运行时加载 | 编译时符号解析 |
| 文件体积 | 增大可执行文件 | 可执行文件较小 | 很小(仅符号表) |
| 多进程共享 | 否 | 是 | 依赖动态库共享 |
| 更新维护 | 需重新编译程序 | 替换动态库即可 | 需更新动态库 |
CMake 配置示例
Windows(MSVC)
# 链接导入库
target_link_libraries(myapp PRIVATE mylib.lib)# 运行时自动复制.dll到输出目录
add_custom_command(TARGET myapp POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy"${CMAKE_SOURCE_DIR}/libs/mylib.dll"$<TARGET_FILE_DIR:myapp>
)
Linux/MinGW
# 链接动态库
target_link_libraries(myapp PRIVATE mylib)# 设置运行时库路径(可选)
set(CMAKE_INSTALL_RPATH "$ORIGIN")
常见问题
-
Windows下MinGW生成的导入库是
.dll.a还是.lib?- MinGW生成
.dll和对应的.dll.a(导入库),而MSVC生成.dll和.lib。
- MinGW生成
-
Linux是否需要导入库?
- 不需要,直接通过
.so文件在编译时指定-l选项即可。
- 不需要,直接通过
-
如何区分静态库和导入库(均为.lib)?
- 在Windows下,若同时存在同名
.lib和.dll,则.lib为导入库;若仅有.lib且无可执行代码依赖,则为静态库。
- 在Windows下,若同时存在同名
总结
- 静态库:适合代码独立、无频繁更新的场景,避免外部依赖。
- 动态库:优化内存使用,支持热更新,需管理运行时路径。
- 导入库:Windows特有机制,桥接编译与运行时依赖。
相关文章:
动态库、静态库、导入库
静态库、动态库与导入库详解 核心概念 类型定义文件扩展名链接方式运行时依赖静态库预编译代码集合,编译时嵌入可执行文件.lib (Windows)、.a (Linux/MinGW)直接链接到可执行文件无动态库运行时加载的代码库,允许多程序共享.dll (Windows)、.so (Linux)…...
电子硬件入门(三)——偏置电路
文章目录 一、先理解问题:为什么需要偏置电压?二.偏置电路生成的四大核心零件三、工作流程图解四、实物电路对照五、常见问题答疑 一、先理解问题:为什么需要偏置电压? 想象一下,电机的电流像一条波浪线&#x…...
使用C++写一个递推计算均方差和标准差的用例
文章目录 代码输出关键实现说明1. 类设计2. 算法核心3. 数值稳定性 扩展应用场景1. 实时传感器数据处理2. 大规模数据集分块处理 总结 以下是用 C 实现递推计算均值、方差和标准差的完整示例代码,基于 Welford 算法,适用于实时数据流或大数据场景&#x…...
springBoot中不添加依赖 , 手动生成一个token ,并校验token,在统一拦截器中进行校验 (使用简单 , 但是安全性会低一点)
要在 Spring Boot 里实现接口统一拦截并校验 Token,可以借助 Spring 的拦截器机制。下面是具体的实现步骤和代码示例。 1. 创建 Token 工具类 import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgori…...
Vue:单文件组件
Vue:单文件组件 1、 什么是单文件组件? 在传统的Vue开发里,我们接触的是非单文件组件,它们通常被定义在同一个HTML文件中,随着项目规模的扩大,代码会变得杂乱无章,维护起来极为困难。而单文件…...
HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南
概述 HUAWEI DevEco Studio(以下简称 DevEco Studio)是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台,专为 HarmonyOS 系统上的应用和元服务(以下简称 应用/元服务)提供高效的开发环境。 作为一款专业…...
IntelliJ IDEA 调试技巧指南
在日常开发中,调试是不可或缺的一部分。掌握调试工具的使用可以让我们更高效地定位和解决问题。本文将介绍一些在 IntelliJ IDEA 中常用的调试技巧,希望能帮助你在开发过程中更顺畅地解决问题。 1. 方法断点:快速定位实现类 方法断点可以帮…...
JavaScript变量声明与DOM操作指南
变量声明 1.变量声明有三个 var let 和 const 我们应该用那个呢? 首先var 先排除,老派写法,问题很多,可以淘汰掉… 2.let or const ? 建议: const 优先,尽量使用const,原因是:…...
嵌入式硬件篇---龙芯UART通信
文章目录 前言一、代码结构解析1. 头文件部分作用 2. 宏定义与全局变量龙芯特性 3. 主函数流程关键点 4. UART发送函数龙芯实现 5. 串口配置函数(set_port)龙芯注意事项 6. GPIO控制函数龙芯GPIO特性 7. PWM控制函数龙芯PWM实现 二、龙芯UART深度解析1. …...
[K!nd4SUS 2025] Crypto
最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上,完成5/6,最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀,名词忘了,但意思还是知道。 b a*s e 这里的e是高斯分成,用1000…...
随机变量的不同收敛性
随机变量不同收敛性:一场有趣的趋近之旅😜 一、引言 在概率论这个奇妙的世界里,随机变量就像一群调皮的小精灵🧚 它们的行为充满了不确定性。而今天我们要讲的,就是这些小精灵们的 “趋近大冒险”—— 随机变量的不同…...
JavaScript 函数类型详解:函数声明、函数表达式、箭头函数
在 JavaScript 中,函数是构建逻辑的核心单元。本文将通过 定义对比、核心特性 和 使用场景 三个维度,全面解析以下三种函数类型的区别: 函数声明(Function Declaration)函数表达式(Function Expression&am…...
工作记录 2017-02-04
工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors,见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…...
Etcd 服务搭建
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…...
【C++】stack和queue的使用及模拟实现(含deque的简单介绍)
文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍(引入…...
Spring Boot - Spring Boot 静态资源映射(默认静态资源映射、自定义静态资源映射)
一、静态资源映射 在 Spring Boot 中,静态资源的映射是指将特定的 URL 路径与静态资源关联起来 静态资源有例如,HTML、CSS、JS、图片等 这使得客户端可以通过 URL 路径访问这些资源 二、默认静态资源映射 概述 Spring Boot 默认会将以下目录中的文件…...
MySQL原理:逻辑架构
目的:了解 SQL执行流程 以及 MySQL 内部架构,每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层:连接层 3.1 数据库连接池(Conn…...
ora-600 ktugct: corruption detected---惜分飞
接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…...
Houdini :《哪吒2》神话与科技碰撞的创新之旅
《哪吒2》(即《哪吒之魔童闹海》)截止至今日,荣登全球票房榜第五。根据猫眼专业版数据,截至2025年3月15日,《哪吒2》全球累计票房(含预售及海外)超过150.19亿元,超越《星球大战&…...
flink 写入es的依赖导入问题(踩坑记录)
flink 写入es的依赖导入问题(踩坑记录) ps:可能只是flink低版本才会有这个问题 1. 按照官网的导入方式: 2. 你会在运行sql-client的时候完美得到一个错误: Exception in thread "main" org.apache.flink.table.client.SqlClientEx…...
PCL 高斯函数拟合(正太分布)
文章目录 一、简介二、实现代码三、实现效果一、简介 类似于之前最小二乘法的做法,我们需要先确定目标函数: 通过最小二乘法,找到使预测值与实际数据残差平方和最小的参数: 不过由于这是一个非线性最小二乘问题,因此这里无法使用矩阵的形式之间求解它的解析解了,因此这里…...
深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习
一文快速了解 ResNet创新点 在深度学习的历史长河中,2015年或许是最具突破性的一年。这一年,微软亚洲研究院的何恺明团队带着名为ResNet(残差网络)的模型横空出世,在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…...
Java基础与集合
参考 Java基础知识详解:从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文(20w字)_java面试八股文-CSDN博客 基础知识 java概述 什么是java? java是一种面向对象的编程语言 java特点 面向对象(继承&#…...
【Python 算法零基础 1.线性枚举】
我装作漠视一切,以为这样就可以不在乎 —— 25.3.17 一、线性枚举的基本概念 1.时间复杂度 线性枚举的时间复杂度为 O(nm),其中 n是线性表的长度。m 是每次操作的量级,对于求最大值和求和来说,因为操作比较简单,所以 …...
深入理解 Linux 的 top 命令:实时监控系统性能
在 Linux 系统管理和性能优化中,top 命令是一个不可或缺的工具。它可以实时显示系统的进程信息和资源使用情况,帮助管理员快速定位性能瓶颈。本文将详细介绍 top 命令的输出内容及其使用方法,帮助你更好地掌握系统性能监控。 一、top 命令简介 top 是一个动态显示系统状态的…...
003 SpringCloud整合-LogStash安装及ELK日志收集
SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…...
AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月18日第22弹
前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。 由于本人既精…...
数据结构入门(1)——算法复杂度
目录 一、前言 二、数据结构 2.1数据结构的概念 2.2数据结构的组成 2.3算法 三、oj题引进 四、复杂度 4.1复杂度的概念 4.2大O渐进表示法 4.3时间复杂度 4.4时间复杂度计算示例 4.4.1示例1 4.4.2示例2 4.4.3示例3 4.4.4示例4 4.4.5示例5 4.4.6示例6 4.4.7示例7 4.4.8示例8 4.5空…...
JavaScript基础-DOM 简介
在现代Web开发中,JavaScript与HTML和CSS一起构成了网页的核心技术。而在这三者之中,DOM(Document Object Model,文档对象模型)作为浏览器处理网页内容的一种接口,扮演着至关重要的角色。通过DOM,…...
VS Code + Git 分支操作指南(附流程图)
VS Code + Git 分支操作指南(附流程图) 本指南将手把手教你如何在 Visual Studio Code (VS Code) 中使用 Git 进行项目开发管理,配合标准分支模型(main、develop、feature/* 等),并附上直观的流程图,适合新手快速上手! 📌 前置准备 安装 Git安装 VS Code安装 VS Cod…...
