linux C++ 共享库导出类

摘要:
以下是插件设计示例:1.主执行程序:Main。cpp#include#include#include#include“SMSGamePlugin.h”intmain{void*GameLib=dlopen;constchar*dlError=delerr();if{˂“dlopenerror!

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"编译后运行时就会提示:

免责声明:文章转载自《linux C++ 共享库导出类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android开始之dialog警告框,单选/多选框/自定义对话框微信小程序http转https下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux下如何修改用户默认目录

  Linux下默认的用户目录一般为/home/xxx(root用户除外),有些时候我们可能需要修改这个目录,下面我就给大家分享2中修改的方法 工具/原料 Linux操作系统 方法/步骤 1 1、切换到root用户,直接修改/etc/passwd文件,找到你的用户名你一行,如下图所示修改路径,然后保存即可。 2 2、切换到root用户,使...

linux /etc/fstab 文件详细说明(整理版)

转至:https://blog.csdn.net/xiaolongwang2010/article/details/8657332?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242 fstab这个文件...

Linux命令--ss命令的参数及使用详解

  ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。 一、ss命令的参数如下 Usage: ss [ OPTIONS ] ss [ OPTIONS ] [...

Linux服务之httpd基本配置详解

一、基本介绍 1、版本 httpd-1.3 httpd-2.0 httpd-2.2 httpd-2.4 目前为止最新的版本是httpd-2.4.6,但是这里我用的是系统自带的RPM包安装的httpd-2.2.15版本的,最新版本配置可能会有所不同 2、模型: 高度模块化:DSO MPM:Multipath Processing Modu...

谁动了我的cpu——oprofile使用札记

http://www.cnblogs.com/bangerlee/archive/2012/08/30/2659435.html 引言 cpu无端占用高?应用程序响应慢?苦于没有分析的工具? oprofile利用cpu硬件层面提供的性能计数器(performance counter),通过计数采样,帮助我们从进程、函数、代码层面找出占用cpu的"罪魁祸首"...

linux 安装nginx

1、检查服务器上是否已安装nginx:nginx -v 2、查看编译参数:nginx -v 3、 查看安装目录:rpm -ql nginx 4、查看配置文件:/etc/logrotate.d/nginx 5、在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。   5.1、rpm包安装的...