首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

dlopen函数有关问题

2012-04-19 
dlopen函数问题头文件C/C++ code//VDS_core.h#ifndef VDS_CORE_H_#define VDS_CORE_H_// 定义强制C类型以

dlopen函数问题
头文件

C/C++ code
//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_ */



主文件
C/C++ code
//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;}//主文件结束

为什么总是会报
undefined reference to `dlopen'
undefined reference to `dlsym'
undefined reference to `dlerror'
undefined reference to `dlclose'
我用的是eclipse+CDT,而且我在编译参数中也加了-ldl,真的是头疼啊。。。。



[解决办法]
是链接参数-ldl

热点排行