dlopen函数问题
头文件
//VDS_core.h#ifndef VDS_CORE_H_#define VDS_CORE_H_// 定义强制C类型以回避C++命名规范,这样我们就可以定义dlsym()#ifdef __cplusplusextern "C" {#endifclass CPlugMain{public:virtual int Action() = 0;};// 下面是Plugin的通用函数,每个Plugin都会重载这个函数,主程序将创建唯一的子进程extern CPlugMain *CreatePlug();typedef CPlugMain * (*CREATEPLUG_PROC)();#ifdef __cplusplus}#endif //#define cplusplus#endif /* VDS_CORE_H_ */
//VDS_core.cpp#include <stdio.h>#include<stdlib.h>#include <dlfcn.h>#include "VDS_core.h"//下面将定义固定的Plugin名称,读者可以自行定义如同Windows注册表那样的Plugin注册系统#define NUM_PLUGINS 2char * szPlugins[]={"./plugin1.so","./plugin2.so"};int main(int argc, char ** argv){ CREATEPLUG_PROC createproc[NUM_PLUGINS]; CPlugMain * pPlugins[NUM_PLUGINS]; void * handle[NUM_PLUGINS]; char * error; int i; //加载所有Plugin for(i=0;i<NUM_PLUGINS;i++){ printf("加载plugin%s.\n",szPlugins[i]); //加载Plugin动态链接库 if(NULL==(handle[i]=dlopen(szPlugins[i],RTLD_LAZY))){ handle[i]=NULL; printf("dlopenerror(%s)\n",szPlugins[i]); }else{ //取得CreatePlug的地址 createproc[i]=(CREATEPLUG_PROC)dlsym(handle[i],"CreatePlug"); if((error=dlerror())!=NULL){ dlclose(handle[i]); handle[i]=NULL; printf("dlsymerror(%s)\n",szPlugins[i]); }else{ //创建plugin进程 pPlugins[i]=createproc[i](); } } }//执行plugin的动作 printf("正在运行plugin..\n"); for(i=0;i<NUM_PLUGINS;i++){ if(handle[i]!=NULL){ pPlugins[i]->Action(); } } //关闭plugin for(i=0;i<NUM_PLUGINS;i++){ if(handle[i]!=NULL){ dlclose(handle[i]); handle[i]=NULL; } } return 0;}//主文件结束