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"编译后运行时就会提示:
linux C++ 共享库导出类的更多相关文章
- 转:linux下共享库的注意点之-fpic
转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...
- Linux动态共享库
Linux操作系统上面的动态共享库大致分为三类: 一.操作系统级别的共享库和基础的系统工具库 libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/us ...
- Linux下共享库嵌套依赖问题 (转载)
转自:http://my.oschina.net/moooofly/blog/506466 问题场景: 动态库 librabbitmq_r.so 内部依赖动态库 libevent_core.so 和 ...
- linux下共享库的注意点之-fpic
在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n") ...
- Linux 下 GCC 编译共享库控制导出函数的方法
通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪 ...
- linux共享库
linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...
- Android NDK 使用自己的共享库(Import Module)
LOCAL_PATH := $(call my-dir)//标准mk语句,指编译路径,所有mk文件第一句都是这个 /**这个模块表示引用了一个本地的静态库include $(CLEAR_VARS) / ...
- Linux共享库、静态库、动态库详解
1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库 ...
- Linux 共享库(动态库)
Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”.因为这一原因,静态可执行程序不依赖任何外 ...
随机推荐
- swift uiview弹出动画
UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.0, ...
- NS_ENUM vs. NS_OPTIONS
NS_ENUM用于定义普通枚举值,NS_OPTIONS用于定义位移相关操作的枚举值: typedef NS_ENUM(NSUInteger, EOCConnectionState) { EOCConn ...
- I18N
App.config <?xml version="1.0" encoding="utf-8" ?> <configuration> & ...
- Spark 1.1.0 安装测试 (分布式 Yarn-cluster模式)
Spark版本:spark-1.1.0-bin-hadoop2.4 (下载:http://spark.apache.org/downloads.html) 服务器环境的情况,请参考上篇博文 hbase ...
- 使用phantomjs操作DOM并对页面进行截图需要注意的几个问题
phantomjs是一个无界面浏览器,可用于网页截图和前端自动化测试,基于webkit内核(也就是chrome使用的内核),并使用js编写业务脚本来请求.浏览和操作页面.最近前端监控需要用到phant ...
- 基于chrome内核的UXSS
url with a leading NULL byte can bypass cross origin protection. https://code.google.com/p/chromium/ ...
- centos jenkins
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import htt ...
- (转)awk实例练习(一)
文章转自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591822.html 前一篇学习了awk的基本知识,现在来做一些练习加深一下印象. ...
- max-width实现图片的自适应
在自适应布局中,有时候会让图片随着宽度的变化相应的放大或者缩小,或者说让图片等比缩放,但是每个图片的大小又不一样,这个时候我们就要用到max-width这个属性了. img{ max-width:10 ...
- Hibernate <二级缓存>
二级缓存: 定义: 1.二级缓存被称为进程级缓存或者sessionFactory级缓存,二级缓存可以被所有session共享 2.二级缓存的生命周期和sessionFactory生命周期一样(sess ...