日期:2014-05-16  浏览次数:20718 次

dlopen函数问题
头文件
C/C++ code

//VDS_core.h
#ifndef VDS_CORE_H_
#define VDS_CORE_H_

// 定义强制C类型以回避C++命名规范,这样我们就可以定义dlsym()

#ifdef __cplusplus

extern "C" {

#endif
class 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 2
char * 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