C++动态库和静态库的使用
1. 引言
动态库和静态库是常用的C++函数内部封装方式,有必要对其有一个深入的了解。
2. 动态库与静态库的概念
C++程序编译分** 预编译** -> 编译 ->汇编 ->链接这几部组成,其中链接时做的就是将目标文件与所需的附加目标文件链接,生成可执行文件。动态与静态的区别主要就在于库链接时候的状态,具体差别如下:
- 静态库: 在链接的时候,会和汇编文件一起打包生成一个可执行文件,成为程序的一部分。
- 动态库:动态库在编译的时候不会有任何的变化,只有在程序运行时才会被加载到,它与执行文件是分开的,只是执行问价在某个时候调用了它。
3. 特性对比
静态库优点:
- 可执行文件的依赖比较少,不需要额外条件依赖问价。
- 编译阶段完成链接,代码的装载速度快。
- 在Windows下以.lib的格式存储,在Linux下以.a的格式存储。
静态库缺点:
- 执行文件会变大
- 升级不方便,每次都需要重新的编译。
动态库优点:
- 可以实现多个进程之间的资源的共享。
- 升级时较为简单不需要重新编译
- Windows下以.lib和.dll文件存储,Linux下以.so格式存储。
动态库缺点:
- 运行期间加载,会减慢代码执行速度。
- 必须跟着可执行文件一起,会增加过多的依赖。
4. 实现与使用
4.1 静态库
4.1.1 静态库实现
- 首先建立一个静态库文件项目,在项目里边实现函数的头文件和cpp文件。
- 然后,进行编译在Debug文件夹下就有.lib后缀的文件出现,将改文件拖到需要的项目中去,并包含头文件就可以直接使用了。
4.1.2 静态库加载
- 首先,包含链接静态库的位置,属性面板”—》”配置属性” —》“C/C++” —》” 常规”,在“附加包含目录”属性值中,键入StaticLib.h 头文件所在目录的路径或浏览至该目录。
- 然后,将头文件直接引用到项目中就可以直接使用相应的函数了。
- 最后直接使用就行。
4.2 动态库
4.2.1 动态库实现
- 在创建win32控制台程序或者win32项目的时候,勾选Dll就可以,进入项目后发现自动生成一些文件。
- 这里需要注意,生成两个有用文件,一个是.lib,一个是dll。这里的.lib本质上不同于静态库中的.lib。这里的.lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体实现。而静态库中的lib包含了索引和实现。
4.2.1 动态库加载
加载动态库有两种方式,分为隐式加载和显示加载。
- 隐式加载:所需文件:接口.h头文件,dll文件,lib文件。.h和.lib加载方式与静态加载完全一致。但.dll文件必须放在环境变量指定的目下。当然通常是与目标.exe文件放在一起。
- 显式加载:所需文件:dll文件。利用LoadLibrary()函数进行加载。