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

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

3、调用示例如下:
hDll = LoadLibrary(“c:\demo\test.dll”);//加载指定路径的DLL
if(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系列编程工具
