C++Helper--动态库的显式调用

  本文主要介绍C++动态库的显式调用方法,及其封装。

  本文源码见【完整代码】章节,或GitHub:https://github.com/deargo/cpphelper。

动态库和静态库

  动态库全称动态链接库(dynamic link library),他包含了函数所在的DLL文件和文件中函数位置的信息(入口),在运行时被加载。静态库全称静态链接库(static link library),他包含函数代码本身,在编译时直接将代码加入程序当中。

  从字面意思来看,区别就是静态和动态,而这里的静态和动态,指的是库的链接阶段。可以看如下的编译过程:

  • 静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
  • 动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

  和静态库比较,动态库并没有在编译的时候被编译进目标代码中,程序在执行相关函数时才调用该函数库里相应函数,因此使用动态库的可执行文件比较小。

  由于函数库没有被整合进可执行文件,而是程序运行时候动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响可执行文件,所以动态函数库升级比较方便。

动态库的调用方式

  动态库的调用方式有两种:动态调用(又叫显示调用)、静态调用(又叫隐式调用):

  1、隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接;而显式调用则要求程序员在调用时,指明要加载的动态库的名称和要调用的函数名称。

  2、隐式调用由系统加载完成,对程序员透明;显式调用由程序员在需要使用时自己加载,不再使用时,自己负责卸载。

  3、由于显式调用由程序员负责加载和卸载,好比动态申请内存空间,需要时就申请,不用时立即释放,因此显式调用对内存的使用更加合理, 大型项目中应使用显示调用。

  4、当动态链接库中只提供函数接口,而该函数没有封装到类里面时,如果使用显式调用的方式,调用方甚至不需要包含动态链接库的头文件,而使用隐式调用时,则调用方不可避免要加上动态库中的头文件,编译时还需指明包含的头文件的位置。

  需要注意的是,当动态链接库中的接口函数是作为成员函数封装在类里面时,即使使用显式调用的方式,调用方也必须包含动态库中的相应头文件。

  5、显式调用更加灵活,可以模拟多态效果。

  显式调用是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。

动态库的显式调用

  在应用程序中,分三步走:加载动态库、获取函数并调用、卸载动态库。

  在Windows系统中,与动态库调用有关的函数包括:

  •   调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
  •   调用 GetProcAddress 将符号名或标识号转换为DLL内部地址,以获取指向应用程序要调用的,每个导出函数的函数指针。
  •   使用完 DLL 后调用 FreeLibrary。

  在Linux中,#include <

你可能感兴趣的:(C/C++,C++Helper系列,c++,dll,c++11)