基于动态库的C++插件开发模型
基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供2个统一的方法:1) baseClass * create(); 2) void destroy( baseClass* );,调用该实际类的上下文,通过dlopen,dlsym( dl, "create"), dlsym( dl, "destroy")来获得实际对象的句柄。实际上是一种工厂/builder模型。
1. 基类
//base.h
#include <iostream> class baseClass { public:
virtual void test(){};
virtual ~baseClass(){};
}; //typedef baseClass* create_t();
typedef baseClass* (*create_t)();
typedef void (*destroy_t)(baseClass*);
2. 继承类
#include "base.h"
#include <iostream> class a: public baseClass {
public: void test()
{
std::cout << "in a" << std::endl;
}
}; // the class factories extern "C" baseClass* create() {
return new a;
} extern "C" void destroy(baseClass* p) {
delete p;
}
编译方法:
> g++ -g -fPIC a.cpp
> g++ -g -shared -o liba.so a.o
3. 调用类
#include "base.h"
void *load_so(const char*so_path)
{
void* dl = dlopen(so_path, RTLD_LAZY);
if (!dl) {
cerr << "Cannot load library: " << dlerror() << '\n';
}
return dl;
} int test_so(void *dl)
{
if (!dl) {
return ;
} create_t create_func = (create_t) dlsym(dl, "create");
destroy_t destroy_func = (destroy_t) dlsym(dl, "destroy");
if (!create_func || !destroy_func) {
cerr << "Cannot load symbols: " << dlerror() << '\n';
return -;
}
baseClass* base = create_func();
base->test();
destroy_func(base); dlclose(dl);
return ;
} int main()
{
void *dl = load_so("./liba.so");
test_so(dl); dl = load_so("./libb.so");
test_so(dl); dl = load_so("./libc.so");
test_so(dl);
return 0;
}
基于动态库的C++插件开发模型的更多相关文章
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
- 【1】基于OpenCV的DLL动态库隐式连接
1DLL的作用 DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能 ...
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...
- Unity跨平台C/CPP动态库编译---可靠UDP网络库kcp基于CMake的各平台构建实践
1.为什么需要动态库 a)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. b)某 ...
- Unity3D跨平台动态库编译---记kcp基于CMake的各平台构建实践
一 为什么需要动态库 1)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. 2)某 ...
- 基于Wiki的知识共享平台模型架构
一.引言 当今的全球化知识经济社会中呈现出信息泛滥和知识更新周期短的现象,知识管理逐渐成为现代企业管理中不容忽视的一环.虚拟企业是基于共识目标而组成的动态协作组织,成员参与的流动性与各成员之间地域分布 ...
- Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配
(原创:http://www.cnblogs.com/linguanh) 目录: 前序 一,问题描述 二,为何会如此"无情"? 三,目前存在该问题的知名SDK 四,解决方案,1 对 ...
随机推荐
- 32、handler更新控件值
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os. ...
- win7(64位)+IE8+QC9.0
环境win7(64位)+IE8+QC9.0出现的问题IE8访问QC9.0有时访问登录显示正常,但是有时访问QC页面无法显示正常,然后在ie8中安全中设置“启用内存保护帮助减少联机攻击*”也无法找到该项 ...
- Makefile.am讲解
Makefile.am详解 实战Makefile.amMakefile.am是一种比Makefile更高层次的规则.只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成.表一列出了可执行 ...
- HDU-4639 Hehe 简单DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4639 简单递推题,呵呵,不多说... //STATUS:C++_AC_15MS_272KB #incl ...
- Adding an On/Off switch to your Raspberry Pi
http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi#articl ...
- 问题-Tbutton(sender) 与 (sender as Tbutton) 等价吗?
问题:Tbutton(sender) 与 (sender as Tbutton) 等价吗? 答: 1. Sender As TButton时delphi做类型检查. 比如: var frm:TFo ...
- SQL2008-截取字段函数
ltrim() int转字符 Left('ABC',2)='AB' right('ABC',2)='BC' SUBSTRING('ABC',1,2)='AB' 和DELPHI中的COPY一样Sub ...
- Oracle-数据实现竖排打印
--存放重证评分的数据表create table ZZPFapache2( ZZ_datetime DATE, --时间 ZZ_zongfen INTEGER, --总分 ZZ_shiwan ...
- 【C语言】-数据输入-scanf( )和getchar( )
格式化输入函数scanf( ) scanf( )功能: 按照指定的格式读入键盘上输入的若干个任意类型的数据,存入到argument参数所指向的内存单元,函数返回值为读入并赋给argument的数据个数 ...
- web开发工具类
1.日期工具类 import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { public sta ...