刚才在网上看到一篇文章讲Linux下库文件的动态加载,代码很简单:
linux下动态加载库主要使用以下几个函数:
void *dlopen(const char *filename, int flag);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
分别对应了打开,加载和关闭
dlopen中filename为库所在的位置,falg一般最多使用RTLD_LAZY和RTLD_NOW分别对应使用时加载和立即加载
其会返回一个void指针,对应于dlsym中的第一个参数。
dlsym中handle即为dlopen的返回值,symbol以字符串出现,对应库中定义的函式的名称,返回指向该函式的指针
dlclose则应在不用该库时调用,自然是关闭它了。
假设某库中有一个函式声明如下
void println(const char * );
下面给一段超级简单的例子
#include <dlfcn.h>
typedef void (*Func)(const char * );
int main()
{
void * handle;
Func func;
char *tmp="abc";
handle=dlopen("./lib.so",RTLD_LAZY);
if(handle==NULL)
{
perror("oops, handle set abnormal");
}
func=(Func)dlsym(handle,"println");
func(tmp);
dlclose(handle);
return 0;
}
那段代码怎么看着那么眼熟呢?wow!原来和《C语言也能干大事》第二十一节里讲的Windows下动态加载dll动态链接库的代码差不多呀:
typedef int(__cdecl* FunctionAdd)(int,int);
HMODULE hModule;
FunctionAdd add;
hModule = LoadLibrary("dll1.dll");//调试时hModule为0x10000000
if(NULL==hModule )
{
//error.
}
add=(FunctionAdd)GetProcAddress(hModule,"add");
int r = add(1,1);
FreeLibrary(hModule);
dlopen就相当于LoadLibrary,dlsym就相当于GetProcAddress,dlclose就相当于FreeLibrary!
Windows下加载dll是:定义函数指针、LoadLibrary加载动态库、GetProcAddress得到函数指针、通过函数指针调用函数、FreeLibrary释放链接库。Linux底下是:定义函数指针、dlopen加载动态库、dlsym得到函数指针、通过函数指针调用函数、dlclose释放链接库。
也许你看这两段代码完全不一样,可是在我眼中则是完全一样!!!
难道我也到达了看透事物本质,一通百通的水平?一通百通伟大思想万岁!哈哈,兴奋ing……
看来把Windows底下编程真正玩熟了以后需要弄Linux编程也是易如反掌呀!!!好好继续学习研究Windows下C编程,玩深了、玩儿熟了,希望有一点我也能三天掌握Linux编程!