当前位置: 技术问答>linux和unix
linux下动态链接库生成问题
来源: 互联网 发布时间:2016-04-18
本文导语: 参照《linux插件开发应用案例》写的一个程序,在调用dlopen的时候返回NULL。我尝试在主程序中打开其他的库,打开正常,所以应该是动态库生成有问题,麻烦高手们看看问题在哪里?小女子感激不尽!!!~ /********plu...
参照《linux插件开发应用案例》写的一个程序,在调用dlopen的时候返回NULL。我尝试在主程序中打开其他的库,打开正常,所以应该是动态库生成有问题,麻烦高手们看看问题在哪里?小女子感激不尽!!!~
/********plugin_main.h***********/ 定义了一个基类
#ifndef _PLUG_MAIN_H_
#define _PLUG_MAIN_H_
#ifndef _cplusplus
extern "C"
{
#endif
class CPlugMain
{
public:
CPlugMain(){};
virtual int Action();
};
typedef CPlugMain (*CREATEPLUG_PROC)();
#ifdef _cplusplus
}
#endif
/********plugin_1.h***********/ //定义派生类
#ifndef _PLUGIN_1_H_
#define _PLUGIN_1_H_
#include "plugin_main.h"
class CPlugin1:public CPlugMain
{
public:
virtual int Action();
};
#endif
/********plugin_1.cpp***********/
include "plugin_1.h"
#include
void * CreatePlug()
{
return new CPlugin1;
}
int CPlugin1::Action()
{
printf("plugin1运行正常n");
return 0;
}
*******************************
编译方法:
#gcc -fpic -shared -o plugin1.so plugin_1.cpp
*******************************
/********plug.cpp***********/
#include "plugin_main.h"
#include
#include
int main()
{
CREATEPLUG_PROC createproc;
CPlugMain *pPlugins;
void * handle;
char * error;
printf("加载/plugin1.son");
handle=dlopen("./plugin1.so",RTLD_LAZY); //plugin1.so在当前文件夹下
if(!handle)
{
printf("dlopen error(./plugin1.so)n");
return 0;
}
else
{
createproc=(CREATEPLUG_PROC)dlsym(handle,"CreatePlug");
if((error=dlerror())!=NULL)
{
dlclose(handle);
handle=NULL;
printf("dlsym error(./pluin1.so)n");
}
else
{
*pPlugins=createproc();
}
}
printf("运行plugin..n");
if(handle!=NULL)
{
pPlugins->Action();
}
if(handle!=NULL)
{
dlclose(handle);
handle=NULL;
}
return 0;
}
*******************************
编译方法:
#gcc -o plug plug.cpp -ldl
*******************************
错误提示:
dlopen error(./plugin1.so)
/********plugin_main.h***********/ 定义了一个基类
#ifndef _PLUG_MAIN_H_
#define _PLUG_MAIN_H_
#ifndef _cplusplus
extern "C"
{
#endif
class CPlugMain
{
public:
CPlugMain(){};
virtual int Action();
};
typedef CPlugMain (*CREATEPLUG_PROC)();
#ifdef _cplusplus
}
#endif
/********plugin_1.h***********/ //定义派生类
#ifndef _PLUGIN_1_H_
#define _PLUGIN_1_H_
#include "plugin_main.h"
class CPlugin1:public CPlugMain
{
public:
virtual int Action();
};
#endif
/********plugin_1.cpp***********/
include "plugin_1.h"
#include
void * CreatePlug()
{
return new CPlugin1;
}
int CPlugin1::Action()
{
printf("plugin1运行正常n");
return 0;
}
*******************************
编译方法:
#gcc -fpic -shared -o plugin1.so plugin_1.cpp
*******************************
/********plug.cpp***********/
#include "plugin_main.h"
#include
#include
int main()
{
CREATEPLUG_PROC createproc;
CPlugMain *pPlugins;
void * handle;
char * error;
printf("加载/plugin1.son");
handle=dlopen("./plugin1.so",RTLD_LAZY); //plugin1.so在当前文件夹下
if(!handle)
{
printf("dlopen error(./plugin1.so)n");
return 0;
}
else
{
createproc=(CREATEPLUG_PROC)dlsym(handle,"CreatePlug");
if((error=dlerror())!=NULL)
{
dlclose(handle);
handle=NULL;
printf("dlsym error(./pluin1.so)n");
}
else
{
*pPlugins=createproc();
}
}
printf("运行plugin..n");
if(handle!=NULL)
{
pPlugins->Action();
}
if(handle!=NULL)
{
dlclose(handle);
handle=NULL;
}
return 0;
}
*******************************
编译方法:
#gcc -o plug plug.cpp -ldl
*******************************
错误提示:
dlopen error(./plugin1.so)
|
-shared ?
|
感觉动态库目录不对,如果不是绝对路径,那么搜索路径是:
(1) 用户环境变量中的LD_LIBRARY值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib
(1) 用户环境变量中的LD_LIBRARY值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib