静态lib文件,动态lib文件和dll文件的区别

本文转自https://blog.csdn.net/woainishifu/article/details/53505866

  • 前言

bin文件夹里面放的都是dll文件;

lib文件夹里面放的都是伴随dll文件的动态lib文件;

staticlib文件夹里面放的才是真正的静态lib文件,和dll文件是独立的;(这种方式目前已经逐渐被抛弃)

  • 静态lib文件

静态lib文件实际上就是任意个obj文件的集合。如果你的工程里有很多个cpp文件,那么就会在编译之后生成很多个obj文件,然后最终只链接生成一个lib文件。 所以,静态lib文件实际上是包含了所有函数的导出声明和实现。你如果把这个lib文件链接到自己的程序中,这个lib文件中的所有代码都会嵌入进来,哪怕你只用到了其中一部分,剩下没用到的也进了你的代码。虽然方便,但是如果大部分你都用不到,自然会导致你的库体积没有意义地变大,失去了使用动态库的灵活性,而且发布新的版本时必须要发布新的应用程序才行,而不是简单打个补丁就好。就是因为这种缺点,才会出现动态dll调用这种方式。

  • 动态lib文件和dll文件

把这两个放在一起来说,是因为一个dll工程生成一个dll文件的时候,总是伴随着生成一个lib文件,这个lib文件其实是一个动态的lib,它的大小比静态lib要小很多,因为这个lib文件其实只是包含了一些函数索引信息,记录了dll中那些函数的入口和位置,dll中才是具体的函数实现。

那么为什么有了dll,还要有一个lib呢?这就是动态库链接的过程了

(1)编译:这个过程只需要用到这里的动态lib文件【注:在静态lib的情况下,仍然只是在编译阶段用到lib文件,只不过静态lib文件包含了完整的实现,所以编译生成exe之后就可以直接用了而已】,然后和你的代码打包到一起。

(2)运行:这个过程就需要用到dll文件了,上面打包好的东西里面,只是记录下了那些用到的函数的入口和具体位置,并没有真正的实现代码,所以在运行期间,就由那些入口找到正确的位于dll中的位置,然后直接执行那些函数就行了。

从上面过程中也可以看出一个很清楚的事实:dll其实就是exe,只不过它没有main函数,所以不能单独执行而已。事实上, 在实际的使用过程中我们也发现,很多应用程序都并不是一个完整的单独可执行文件,它们被分割成一些单独的相对对立的动态链接库,只有在执行应用程序的时候,用到的dll才会被调用。这也就是为什么你经常打开某些程序,会出现“无法加载XXX.dll”的原因了。
 

猜你喜欢

转载自blog.csdn.net/jgj123321/article/details/94621172