动态库与静态库区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应 DLL 文件的支持。

动态库与静态库

通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件 (object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。

所以这些函数库被成为静态库(static libaray),通常文件 名为 “libxxx.a” 的形式。其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dynamic link library)技术。

动态链接

动态链接方法:LoadLibrary()/GetProcessAddress() 和 FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。

静态链接

静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。

静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库。

静态库和动态库的区别

在软件开发的过程中,大家经常会或多或少的使用别人编写的或者系统提供的动态库或静态库,但是究竟是使用静态库还是动态库呢?他们的适用条件是什么呢?

简单的说,静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,顾名思义就是在应用程序启动的时候才会链接,所以,当用户的系统上没有该动态库时,应用程序就会运行失败。再看它们的特点:

动态库

  1. 类库的名字一般是 libxxx.so
  2. 共享:多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;
  3. 开发模块好:要求设计者对功能划分的比较好。
  4. 动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

静态库

  1. 类库的名字一般是 libxxx.a
  2. 代码的装载速度快,执行速度也比较快,因为编译时它只会把你需要的那部分链接进去。
  3. 应用程序相对比较大,如果多个应用程序使用的话,会被装载多次,浪费内存。
  4. 如果静态函数库改变了,那么你的程序必须重新编译。

如果你的系统上有多个应用程序都使用该库的话,就把它编译成动态库,这样虽然刚启动的时候加载比较慢,但是多任务的时候会比较节省内存;如果你的系统上只有一到两个应用使用该库,并且使用的 API 比较少的话,就编译成静态库吧,一般的静态库还可以进行裁剪编译,这样应用程序可能会比较大,但是启动的速度会大大提高。

静态库与动态库优缺点

静态链接库的优点

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

动态链接库的优点

  1. 更加节省内存并减少页面交换;
  2. DLL 文件与 EXE 文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换 DLL 文件不会对 EXE 文件造成任何影响,因而极大地提高了可维护性和可扩展性;
  3. 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个 DLL 函数;
  4. 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

不足之处

  1. 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

  2. 使用动态链接库的应用程序不是自完备的,它依赖的 DLL 模块也要存在,如果使用载入时动态链接,程序启动时发现 DLL 不存在,系统将终止程序并给出错误信息。

    而使用运行时动态链接,系统不会终止,但由于 DLL 中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期 Windows 中很常见。