1、动态库之所以叫动态库,是因为在代码编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。也就是说使用的时候再进行加载。
2、在Windows平台下,为了完成动态库的调用,提供了专门的一组API用于完成打开动态库,调用动态库,关闭动态库等功能。在具体处理中,主要用到了如下几个函数:LoadLibrary、GetProcAddress、FreeLibrary,通过对这几个函数的使用实现动态调用动态库的过程。LoadLibrary必须首先被调用,表示要将库装载到内存,准备使用。GetProcAddress可以获得指定函数在内存中的位置(指针)。FreeLibrary将已经装载的库进行卸载释放。
3、调用示例如下:hDll = LoadLibrary(“c:\demo\test.dll”);//加载指定路径的DLLif(hDll != NULL){ testFun =(lpFun)GetProcAddress(hDll, "test");//获取test方法的内存地址 if(testFun != NULL) { testFun(); } FreeLibrary(hDll); //释放动态库}
4、在Linux平台下,也提供了专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。在具体处理中,主要用到了如下几个函数:dlopen、dlerror、dlsym、dlclose,通过对这几个函数的使用实现动态调用动态库的过程。dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。dlsym可以获得指定函数(symbol)在内存中的位置(指针)。dlclose将已经装载的库句柄减一,如果句柄减至零,则该库会被卸载。如果存在析构函数,则在dlclose之后,析构函数会被调用。
5、调用示例如下:handle = dlopen (argv[1], RTLD_NOW); //打开argv[1]指针指定的动态库,获得调用句柄if(!handle){fprintf (stderr, "%s\n", dlerror());exit(1);}pf_t pf=(pf_t)dlsym(handle,"test");//指针pf指向test函数在当前内存中的地址pf();//通过指针pf,调用动态库中的test函数dlclose(handle);//关闭调用动态库句柄
6、在不同平台上需要使用不同的编译器或IDE进行代码的书写编译,Linux平台上可以使用可使用gcc或者g++编译器;Windows平台上,可以使用visual studio系列编程工具