C++动态库和静态库——动态库和静态库调用方法(详解)

目录

1、前言

2、定义

3、优缺点

4、文件形式

5、生成和加载方式

5.1、静态库

5.2、动态库

6、总结


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

  • 53
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态库静态库的编写方式基本相同,只是在编译链接时需要采用不同的方式。以下是C++动态库静态库的编写方法: ### 静态库 1. 创建静态库项目:打开Visual Studio,选择“新建项目”,然后选择“Win32控制台应用程序”,输入项目名称和路径,点击“确定”按钮。在弹出的窗口中选择“静态库”类型,然后点击“下一步”按钮,最后点击“完成”按钮。 2. 编写库文件代码:在项目中添加源文件,编写库文件的代码,并在头文件中声明需要导出的函数和类。 3. 生成静态库文件:在编译链接时将代码编译成静态库文件,可以手动编译或在Visual Studio中配置。在Visual Studio中,可以选择“生成”菜单中的“生成解决方案”或“生成项目”命令生成静态库文件。生成的静态库文件通常以.lib为扩展名。 4. 使用静态库:在使用静态库的应用程序中,需要在编译链接时将静态库文件链接到可执行文件中。可以在应用程序的项目属性中配置链接选项,将静态库文件添加到链接器的附加依赖项中。在代码中包含头文件即可使用静态库中的函数和类。 ### 动态库 1. 创建动态库项目:打开Visual Studio,选择“新建项目”,然后选择“Win32控制台应用程序”,输入项目名称和路径,点击“确定”按钮。在弹出的窗口中选择“动态链接库(DLL)”类型,然后点击“下一步”按钮,最后点击“完成”按钮。 2. 编写库文件代码:在项目中添加源文件,编写库文件的代码,并在头文件中声明需要导出的函数和类。需要使用__declspec(dllexport)关键字将需要导出的函数或类标记为可导出。 3. 生成动态库文件:在编译链接时将代码编译成动态库文件,可以手动编译或在Visual Studio中配置。在Visual Studio中,可以选择“生成”菜单中的“生成解决方案”或“生成项目”命令生成动态库文件。生成的动态库文件通常以.dll为扩展名。 4. 使用动态库:在使用动态库的应用程序中,需要在运行时加载动态库文件,并使用GetProcAddress函数获取动态库中需要使用的函数或类。在代码中包含头文件即可使用动态库中的函数和类。在编译链接时需要指定动态库文件的路径和名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的鱼-blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值