C++动态库和静态库的使用

1. 引言

动态库和静态库是常用的C++函数内部封装方式,有必要对其有一个深入的了解。

2. 动态库与静态库的概念

C++程序编译分** 预编译** -> 编译 ->汇编 ->链接这几部组成,其中链接时做的就是将目标文件与所需的附加目标文件链接,生成可执行文件。动态与静态的区别主要就在于库链接时候的状态,具体差别如下:

  • 静态库: 在链接的时候,会和汇编文件一起打包生成一个可执行文件,成为程序的一部分。
  • 动态库:动态库在编译的时候不会有任何的变化,只有在程序运行时才会被加载到,它与执行文件是分开的,只是执行问价在某个时候调用了它。

3. 特性对比

静态库优点:

  • 可执行文件的依赖比较少,不需要额外条件依赖问价。
  • 编译阶段完成链接,代码的装载速度快。
  • 在Windows下以.lib的格式存储,在Linux下以.a的格式存储。

静态库缺点:

  • 执行文件会变大
  • 升级不方便,每次都需要重新的编译。

动态库优点:

  • 可以实现多个进程之间的资源的共享。
  • 升级时较为简单不需要重新编译
  • Windows下以.lib和.dll文件存储,Linux下以.so格式存储。

动态库缺点:

  • 运行期间加载,会减慢代码执行速度。
  • 必须跟着可执行文件一起,会增加过多的依赖。

4. 实现与使用

4.1 静态库

4.1.1 静态库实现

  • 首先建立一个静态库文件项目,在项目里边实现函数的头文件和cpp文件。
    C++动态库和静态库的使用
  • 然后,进行编译在Debug文件夹下就有.lib后缀的文件出现,将改文件拖到需要的项目中去,并包含头文件就可以直接使用了。
    C++动态库和静态库的使用

4.1.2 静态库加载

  • 首先,包含链接静态库的位置,属性面板”—》”配置属性” —》“C/C++” —》” 常规”,在“附加包含目录”属性值中,键入StaticLib.h 头文件所在目录的路径或浏览至该目录。
    C++动态库和静态库的使用
    C++动态库和静态库的使用
  • 然后,将头文件直接引用到项目中就可以直接使用相应的函数了。
    C++动态库和静态库的使用
  • 最后直接使用就行。
    C++动态库和静态库的使用

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()函数进行加载。