动态库如何实现动态加载

作者:清风拂面 | 创建时间: 2023-03-25
动态库全称动态链接库,在windows平台上的文件后缀名为dll,所以一般也简称为Dll文件;而在Linux平台上的文件后缀名为so。那么如何实现动态库的动态加载呢,这个不复杂,今天就来说说具体怎么处理。...
动态库如何实现动态加载

操作方法

动态库之所以叫动态库,是因为在代码编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。也就是说使用的时候再进行加载。

在Windows平台下,为了完成动态库的调用,提供了专门的一组API用于完成打开动态库,调用动态库,关闭动态库等功能。 在具体处理中,主要用到了如下几个函数:LoadLibrary、GetProcAddress、FreeLibrary,通过对这几个函数的使用实现动态调用动态库的过程。 LoadLibrary必须首先被调用,表示要将库装载到内存,准备使用。 GetProcAddress可以获得指定函数在内存中的位置(指针)。 FreeLibrary将已经装载的库进行卸载释放。

调用示例如下: hDll = LoadLibrary(“c:\demo\test.dll”);//加载指定路径的DLL if(hDll != NULL){ testFun =(lpFun)GetProcAddress(hDll, "test");//获取test方法的内存地址 if(testFun != NULL) { testFun(); } FreeLibrary(hDll);   //释放动态库 }

在Linux平台下,也提供了专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。 在具体处理中,主要用到了如下几个函数:dlopen、dlerror、dlsym、dlclose,通过对这几个函数的使用实现动态调用动态库的过程。 dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。 dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。 dlsym可以获得指定函数(symbol)在内存中的位置(指针)。 dlclose将已经装载的库句柄减一,如果句柄减至零,则该库会被卸载。如果存在析构函数,则在dlclose之后,析构函数会被调用。

调用示例如下: 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);     //关闭调用动态库句柄

在不同平台上需要使用不同的编译器或IDE进行代码的书写编译,Linux平台上可以使用可使用gcc或者g++编译器;Windows平台上,可以使用visual studio系列编程工具

点击展开全文

更多推荐