基于动态库的C++插件开发模型

时间:2020-12-03 23:39:42

基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供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++插件开发模型的更多相关文章

  1. Linux系统中&OpenCurlyDoubleQuote;动态库”和&OpenCurlyDoubleQuote;静态库”那点事儿 &sol;etc&sol;ld&period;so&period;conf 动态库的后缀为&ast;&period;so 静态库的后缀为 libxxx&period;a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  2. Linux系统中&OpenCurlyDoubleQuote;动态库”和&OpenCurlyDoubleQuote;静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  3. Linux系统中&OpenCurlyDoubleQuote;动态库”和&OpenCurlyDoubleQuote;静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  4. 【1】基于OpenCV的DLL动态库隐式连接

    1DLL的作用 DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能 ...

  5. C&sol;C&plus;&plus; 关于生成静态库(lib&rpar;&sol;动态库&lpar;dll&rpar;文件如何使用&lpar;基于windows基础篇&rpar;

    1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...

  6. Unity跨平台C&sol;CPP动态库编译---可靠UDP网络库kcp基于CMake的各平台构建实践

    1.为什么需要动态库 a)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. b)某 ...

  7. Unity3D跨平台动态库编译---记kcp基于CMake的各平台构建实践

    一 为什么需要动态库 1)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. 2)某 ...

  8. 基于Wiki的知识共享平台模型架构

    一.引言 当今的全球化知识经济社会中呈现出信息泛滥和知识更新周期短的现象,知识管理逐渐成为现代企业管理中不容忽视的一环.虚拟企业是基于共识目标而组成的动态协作组织,成员参与的流动性与各成员之间地域分布 ...

  9. Android 5&period;0 到 Android 6&period;0 &plus; 的深坑之一 之 &period;so 动态库的适配

    (原创:http://www.cnblogs.com/linguanh) 目录: 前序 一,问题描述 二,为何会如此"无情"? 三,目前存在该问题的知名SDK 四,解决方案,1 对 ...

随机推荐

  1. jQuery的DOM操作实例(3)——创建节点&amp&semi;&amp&semi;编写一个弹窗

    一.原生JavaScript编写弹窗 二.jQuery编写弹窗 知识点归纳总结: 在原生JavaScript中,创建一个节点: var oDiv=document.createElement(&quo ...

  2. AngularJS的&dollar;watch用法

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...

  3. 转自知乎:GitHub基本功能

    作者:Fadeoc Khaos 链接:https://www.zhihu.com/question/20070065 来源:知乎 著作权归作者所有Github的基本功能: Repository:你和我 ...

  4. 元音字母A的发音规则

    摘抄自百度文库 A/a的发音比较复杂,归纳起来有10种情况: 一.在重读开音节中读[ei]. 例如: plane [plein]  radio [ˈreidiəu] wake [weik]  pape ...

  5. WebViewJavascriptBridge

    上一篇文章介绍了通过UIWebView实现了OC与JS交互的可能性及实现的原理,并且简单的实现了一个小的示例DEMO,当然也有一部分遗留问题,使用原生实现过程比较繁琐,代码难以维护.这篇文章主要介绍下 ...

  6. SQL中Truncate的用法(转)

    转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...

  7. Python实现简单的HTTP服务器(支持文件上传下载)

    1.python内置模块 SimpleHTTPServer  (支持下载功能) 在对应的工作目录下,运行命令python -m SimpleHTTPServer 即可把当前目录下以共享服务的形式共享出 ...

  8. WPF中查找指定类型的父控件

    /// <summary> /// 查找父控件 /// </summary> /// <typeparam name="T"></type ...

  9. PHP 3 运算符 if&period;&period;&period;else&period;&period;&period;elseif 语句

    <?php $x=10; $y=6; echo ($x + $y); // 输出 16 echo ($x - $y); // 输出 4 echo ($x * $y); // 输出 60 echo ...

  10. php-fpm&period;conf文件的位置在哪里

    在php的安装目录下的etc目录下: