基于动态库的C++插件开发模型
2014-03-06 20:59
225 查看
基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供2个统一的方法:1) baseClass * create(); 2) void destroy( baseClass* );,调用该实际类的上下文,通过dlopen,dlsym( dl, "create"), dlsym( dl, "destroy")来获得实际对象的句柄。实际上是一种工厂/builder模型。
1. 基类
2. 继承类
编译方法:
> g++ -g -fPIC a.cpp
> g++ -g -shared -o liba.so a.o
3. 调用类
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 0; } 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 -1; } baseClass* base = create_func(); base->test(); destroy_func(base); dlclose(dl); return 0; } 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; }
相关文章推荐
- uboot学习笔记(三)启动源码分析之第二阶段(c语言部分)
- C++虚函数和纯虚函数
- 【C++】PAT(advanced level)1056. Mice and Rice (25)
- 24位真彩图分离三通道以及分解位平面 c-c++实现
- c++参数管理
- 24位真彩图转8位灰度图并分解位平面 c-c++实现
- [C++_12]IO_2
- 15款C/C++程序员必备的编译器和IDE
- c++ cout 控制精度、宽度、进制
- C++静态成员和静态成员函数
- 汉诺塔递归演示
- PAT_1055 world richest 多键排序
- 结构体类型(一般方式和位域存储方式)的sizeof
- windows下的C++ socket服务器(3)
- 有序的结构体数组
- 字符串移位包含问题
- 日期
- 身材有料么
- C语言用二分法求方程的近似解的方法
- C语言动态链表 取MP3歌词文件内容 带VC6.0完整工程