linux动态库导出类的成员函数,linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。

2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

以下是一个插件式设计的示例:

1、主执行程序:main.cpp

#include

#include

#include "SMSGamePlugin.h"

int main(int argc, char** argv)

{

void *GameLib =

dlopen("./Flower.so", RTLD_LAZY);

const char *dlError =

dlerror();

if (dlError)

{

< "dlopen error!" << dlError <<

return(-1);

}

CSMSGamePlugin

*(*pGetGameObject)(void);

pGetGameObject = (CSMSGamePlugin

*(*)(void))dlsym(GameLib, "GetGameObject");

dlError = dlerror();

if (dlError)

{

< "dlsym error!" << dlError <<

return(-1);

}

CSMSGamePlugin *pGame =

(*pGetGameObject)();

pGame->Initialize();

pGame->Load();

pGame->Handle();

delete *pGame;

dlclose(GameLib);

}

2、公用基类部分:SMSGamePlugin.h

#ifndef __SMSGamePlugin_h__

#define __SMSGamePlugin_h

class CSMSGamePlugin

{

public:

virtual int Initialize(void) =

0;

virtual int Load(void) = 0;

virtual int Handle(void) = 0;

};

#endif

编译:g++ -rdynamic -ldl -s -o Test main.cpp

3、共享库部分:

共享库头文件:Flower.h

#ifndef __Flower_h__

#define __Flower_h__

#include "SMSGamePlugin.h"

extern "C" CSMSGamePlugin *GetGameObject(void);

class CFlower: public CSMSGamePlugin

{

public:

virtual int Initialize(void);

virtual int Load(void);

virtual int Handle(void);

};

#endif

4、共享库实现文件:Flower.cpp

#include

#include "Flower.h"

CSMSGamePlugin *GetGameObject(void)

{

return(new CFlower());

}

int CFlower::Initialize(void)

{

< "Initialize()" <<

return(0);

}

int CFlower::Load(void)

{

< "Load()" <<

return(0);

}

int CFlower::Handle(void)

{

< "Handle()" <<

return(0);

}

编译:

g++ -c Flower.cpp

g++ -shared -o Flower.so

5、注意:

如果不加extern "C"编译后运行时就会提示:

原文:http://www.cnblogs.com/skyofbitbit/p/3676491.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值