用动态库隔离静态库

大型项目开发时,常常遇到以下情况: 1.第三方库彼此依赖,彼此依赖的第三方库版本有所不同; 2.不同模块,需要使用不同版本的第三方库。

建立一个动态链接库,可以将静态链接库隔离开。

值得指出的是:

只有第三方库是静态库的时候,才能被动态库隔离,如果第三方库是动态库,上层动态库不能起到隔离作用。 为了让后续开发能使用这种隔离机制,功能太少且不涉及静态变量管理的模块,尽量不使用Dll。

Lib文件

Lib文件有两类:

  • 静态链接库的库文件,实际上是Obj文件的打包
  • 动态链接库的链接文件,实际上是提供链接到Dll的方法

静态链接库的Lib

在静态链接库中,代码被编译成了.obj,然后被整合到了.lib文件中,.lib没有将.obj转换为可执行代码,仅仅是做了打包。

动态链接库的Lib

在动态链接库中,代码被编译成了.obj,然后被转换为可执行代码,封装到.dll文件中,.lib仅有提供函数入口的作用。

依赖与隔离

  • 静态库的依赖传递: 在编译阶段,生成静态链接库时,不会进行“链接”操作,所有的库都依赖。
  • 动态库的依赖隔离: 只有当生成.dll或.exe时,需要对之前的依赖项进行链接。链接之后,如果.h文件中不再包含第三方库,当前.dll就对第三方库进行了隔离,衍生库就不必依赖第三方库。

Dll的隔离作用