天天看点

动态链接库与静态链接库

动态链接库

  动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用的技术。其目的减少程序的大小,节省空间,提高效 率,具有很高的灵活性。采用动态库技术对于升级软件版本更加容易。与静态库(Static Link Library)不同,动态库里面的函数不是执行程序本身的一部分,而是根据执行需要按需载入,其执行代码可以同时在多个程序中共享。

  在Linux下,动态链接库以.so的后缀存在!在Windows下,动态链接库以.dll的后缀存在!

  动态链接库不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

a. 共享:多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;

b. 开发模块好:要求设计者对功能划分的比较好。

  使用动态链接库的程序必须将动态链接库部署到相应的环境中,若动态库不存在,程序必然会报错!其次,程序的加载速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。

  不能解决引用计数等问题。

静态链接库

  在Linux下,静态库以.a的后缀名存在,在Windows下,静态库以.lib的后缀名存在!

  库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。

  代码装载速度快,执行速度略比动态链接库快;只需保证在开发者的计算机中有正确的 .LIB/.a 文件,再以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。

  使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;但是如果多个应用程序使用的话,会被装载多次,浪费内存。

两者的不同

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

动态共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。