首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++动态库和静态库_动态库和静态库调用方法

C++动态库和静态库_动态库和静态库调用方法

作者头像
全栈程序员站长
发布于 2022-11-11 06:22:51
发布于 2022-11-11 06:22:51
3.5K0
举报

大家好,又见面了,我是你们的朋友全栈君。

1、前言

从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。

2、定义

静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。

  • 静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
  • 动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

3、优缺点

分清楚二者区别之后,二者的优缺点就自然可以分出来了。

优点

缺点

静态库

1、 使可执行文件依赖项少,已经被打包到可执行文件中了2、 编译阶段完成链接,执行期间代码装载速度快

1、 使可执行文件变大2、 若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包3、 升级不方便,升级必须重新编译

动态库

1、 动态库可以实现进程之间资源共享,有一份就行 2、 升级程序简单,不需要重新编译

1、 运行期间在加载,将会减慢代码执行速度 2、 增加程序的依赖项,必须跟着可执行文件一起

4、文件形式

Tables

Windows

Linux

静态库

.lib

Libxxx.a

动态库

.dll与.lib

libxxx.so

5、生成和加载方式

这里我仅讨论windows下的使用vs的情况。

5.1、静态库:

生成:

在创建win32控制台程序或者win32项目的时候,勾选静态库就可以,进入项目后也可打开工程“属性面板”—》”配置属性”—》”常规”—》配置类型选择静态库。

创建好之后,里面在就正常的写函数或者类,将接口放在.h头文件中,编译后边生成了静态库。 测试代码:

  • 头文件:
  • 源文件:
  • 生成静态库:

Vs中加载

需要文件、接口头文件、.lib库文件。

方式1

步骤1:包头文件。工程“属性面板”—》”配置属性” —》“C/C++” —》” 常规”,在“附加包含目录”属性值中,键入StaticLib.h 头文件所在目录的路径或浏览至该目录。

步骤2:“属性面板”—》”配置属性”—》“链接器”—》”常规”,附加依赖库目录中输入,静态库所在目录;

步骤3:“属性面板”—》”配置属性”—》“链接器”—》”输入”,附加依赖库中输入静态库名StaticLib.lib。

步骤4:使用,引用头文件,即可使用里面的接口。

方式2

步骤1同方式1。 步骤二: 打开工程“属性面板”—》”配置属性” —》“链接器”—》”命令行”,输入静态库的完整路径即可。

方式3: 步骤1同方式1。 步骤2:前提,加载的静态库属于同一解决方案。 工程“属性面板”—》“通用属性”—》 “框架和引用”—》”添加引用”,将显示“添加引用”对话框。 “项目”选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。 在“项目”选项卡中,选择 StaticLib。 单击“确定

方式4: 在文件中使用#pragma comment()指定.lib文件的位置。如图

5.2、动态库

生成

在创建win32控制台程序或者win32项目的时候,勾选Dll就可以,进入项目后发现自动生成一些文件。如图

我们还是正常定义和实现函数或者类,特别的是动态库生成的时候需要在接口前加上 __declspec(dllexport),而导入的时候需要加__declspec(dllimport)。这里使用通常的宏定义做法,如图所示。 头文件:

源文件:

生成动态库:

这里需要注意,生成两个有用文件,一个是.lib,一个是dll。这里的.lib本质上不同于静态库中的.lib。这里的.lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体实现。而静态库中的lib包含了索引和实现。

加载动态库

加载动态库有两种方式,分为隐式加载和显示加载。

隐式加载

所需文件:接口.h头文件,dll文件,lib文件。 .h和.lib加载方式与静态加载完全一致。但.dll文件必须放在环境变量指定的目录下。当然通常是与目标.exe文件放在一起。

显示加载

所需文件:dll文件。 利用LoadLibrary()函数进行加载。如图

按道理不需要.h头文件,但是前提是你知道接口是啥样的。 隐式加载和显示加载区别很明显,显示加载使用灵活,需要时加载,用完卸载,而隐式加载伴随着整个程序的生命周期。

6、总结

库分为静态库和动态库。静态库与可执行文件打包,动态库与可执行文件独立。静态库加载需要.lib和.h文件。动态库隐式加载需要.dll、.h、.lib文件,显示加载只需要.dll文件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187719.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月29日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
allegro查看板子元器件的pin脚总数
怎么在ALLEGRO里统计焊盘和包括芯片pin和阻容的pad? 板子要拿出去布,需要根据焊盘计费?
徐师兄
2022/08/29
2K0
allegro查看板子元器件的pin脚总数
Cadence 配置文件“.cdsenv”介绍和使用
说明:<cds_install_dir>代表安装目录 /xxx/IC618/tools/dfII
蓝色的天空
2023/11/22
2.1K0
Cadence 配置文件“.cdsenv”介绍和使用
Cadence Allegro贴片和插件元器件封装制作流程总结
因为我们制作0805封装,所以PCB焊盘宽度X = 1.20mm,PCB焊盘高度Y = 1.40mm,PCB总长度G = 3.20mm。
黑马Amos
2023/03/21
4.4K0
Cadence Allegro贴片和插件元器件封装制作流程总结
OrCAD原理图元器件编号问题。
注意:如果勾选Preserve reference on copy,则复制出来的编号是不变的,这样会导致编号重复错误。
徐师兄
2022/08/29
1.8K0
OrCAD原理图元器件编号问题。
全志V85X系列芯片原理图要注意些什么?
全志V85X (包括V853、V853S、V851S、V851SE等)是一颗面向智能视觉领域推出的新一代高性能、低功耗的处理器SOC,可广泛用于智能门锁、智能考勤门禁、网络摄像头、行车记录仪、智能台灯等智能化升级相关行业。V85X 集成ARM Cortex-A7和RISC-V E907 双CPU,内置最大 1T 算力 NPU,使用全志自研 Smart 视频引擎,最大支持5M@25fps H.265编码和5M@25fps H.264编解码,同时集成高性能 ISP 图像处理器,可为客户提供专业级图像质量。V85X 还支持 16-bit DDR3/DDR3L,满足各类产品高带宽需求;支持 4lane MIPI-CSI/DVP/MIPI-DSI/RGB 等丰富的专用视频输入输出接口,满足各类AI视觉产品需求;采用先进的22nm工艺,具有更优的功耗和更小的芯片面积。
阿志小管家
2024/02/02
3070
RK3588 EVB开发板原理图讲解【五】
1、VCC_DDR覆铜宽度需满足芯片的电流需求,连接到芯片电源管脚的覆铜足够宽,路径不能被过孔分割太严重,必须计算有效线宽,确认连接到CPU每个电源PIN脚的路径都足够。
用户11537198
2025/03/03
2350
Protel99SE教程(一)——原理图封装
  今天我要讲解的是“如何在protel99se中创建一个原理图封装”,下面开始我们的操作:   第一步:新建“Schlib1.Lib”文件。   点击“File”下的“New”,弹出protel99se所能支持的所有文件格式,选中“Schematic Library Decument”,点击“OK”,新建“Schlib1.Lib”文件,如图1所示。
全栈程序员站长
2022/09/02
2.3K0
RK3588 EVB开发板原理图讲解【七】
RK3588 方案的开机按键由 RK806 管理,下面将详细介绍其相关结构及工作原理。
用户11537198
2025/03/06
2550
OrCAD怎样把原理图输出为DXF格式
又有段时间没分享文章了,想想主要还是自媒体写点内容确实不容易,要不断坚持下来更不容易,一直以来也就是凭着“乐于分享”的心在不定时更新。
徐师兄
2022/08/29
1.3K0
OrCAD怎样把原理图输出为DXF格式
电气设计心得体会_原理图设计规范
本博客将简述中兴通讯股份有限公司在原理图设计中需要注意的一些事项,其中包含了中兴设计开发部积累的大量硬件开发知识和经验,可以作为学习使用。硬件工程师可以学习并掌握检查条目的内容以及对条目的详细说明,学习部门经验。
全栈程序员站长
2022/10/29
1.5K0
电气设计心得体会_原理图设计规范
Java精讲 | 45张图庖丁解牛18种Queue,你知道几种?
本文我们将重点讲解Java中的Queue家族,全文总共涉及到18种Queue。这篇恐怕是市面上最全最细讲解Queue的。 本文主要内容如下: 本篇主要内容 帮你总结好的阻塞队列: 18种Queue总结 一、Queue自我介绍 队列原理图 1.1 Queue自我介绍 hi,大家好,我的英文名叫Queue,中文名叫队列,无论现实生活中还是计算机的世界中,我都是一个很重要的角色哦~ 我是一种数据结构,大家可以把我想象成一个数组,元素从我的一头进入、从另外一头出去,称为FIFO原则(先进先出原则)。 我还
博文视点Broadview
2023/05/19
1.7K0
Java精讲 | 45张图庖丁解牛18种Queue,你知道几种?
一文掌握GSEA,超详细教程
生信宝典之前总结了一篇关于GSEA富集分析的推文——《GSEA富集分析 - 界面操作》,介绍了GSEA的定义、GSEA原理、GSEA分析、Leading-edge分析等,是全网最流行的原理+操作兼备教程,不太了解的朋友可以点击阅读先理解下概念 (为了完整性,下面也会摘录一部分)。
生信宝典
2019/05/15
54.4K1
一文掌握GSEA,超详细教程
protel相关资料
其实,在一块主板上采用蛇行线的原因有两个:一是为了保证走线线路的等长。因为像CPU到北桥芯片的时钟线,它不同于普通家电的电路板线路,在这些线路上以100MHz左右的频率高速运行的信号,对线路的长度十分敏感。不等长的时钟线路会引起信号的不同步,继而造成系统不稳定。故此,某些线路必须以弯曲的方式走线来调节长度。另一个使用蛇行线的常见原因为了尽可能减少电磁辐射(EMI)对主板其余部件和人体的影响。因为高速而单调的数字信号会干扰主板中各种零件的正常工作。通常,主板厂商抑制 EMI的一种简便方法就是设计蛇形线,尽可能多地消化吸收辐射。但是,我们也应该看到,虽然采用蛇行线有上面这些好处,也并不是说在设计主板走线时使用的蛇行线越多越好。因为过多过密的主板走线会造成主板布局的疏密不均,会对主板的质量有一定的影响。好的走线应使主板上各部分线路密度差别不大,并且要尽可能均匀分布,否则很容易造成主板的不稳定。 3、忌用“飞线”主板  判断一块主板走线的好坏,还可以从走线的转弯角度看出来。好的主板布线应该比较均匀整齐,走线转弯角度不应小于135度。因为转弯角度过小的走线在高频电路中相当于电感元件,会对其它设备产生干扰。    而某些设计水平很差的主板厂商在设计走线时,由于技术实力原因往往会导致最后的成品有缺陷。此时,便采取人工修补的方法来解决问题,这种因设计不合理而出现的导线,称之为“飞线”(图2)。如果一块主板上有飞线,就证明该主板的走线设计有一些问题。
全栈程序员站长
2022/06/26
1.7K0
protel相关资料
全志Tina Linux Camera 摄像头模块开发指南 全网最详细版本支持百问网T113-Pro DongshanPI-NezhaD1-H DongshanPI-D1s V853-Pro等开发板
目前Tina 系统的各平台camera 硬件接口、linux 内核版本以及camera 驱动框架如下表所示:
韦东山
2022/12/28
4.8K0
全志Tina Linux Camera 摄像头模块开发指南 全网最详细版本支持百问网T113-Pro DongshanPI-NezhaD1-H DongshanPI-D1s V853-Pro等开发板
相关推荐
allegro查看板子元器件的pin脚总数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档