C++加载动态库的形式来实现封装
目录结构
└── test
├── CMakeLists.txt
├── base.h //设置接口
├── drive.cpp //具体实现
└── main.cpp //test
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (test)
set(CMAKE_CXX_STANDARD 11)
include_directories(./)
add_library(drive SHARED drive.cpp) #将实现添加为动态库
add_executable(test main.cpp) #将test生成可执行
target_link_libraries(test ${CMAKE_DL_LIBS}) #链接dl库
base.h
#ifndef BASE_H
#define BASE_H
#include <iostream>
#include <memory>
#include <dlfcn.h>
using namespace std;
//宏用在drive.cpp中生成产生子类对象的函数
#define USE_MAPFUSION_PLUGIN(C) extern "C"{\
shared_ptr<base> createInstance(){return shared_ptr<base>(new C());}}
class base;
typedef shared_ptr<base> (*funcCreatClass)();
class base {
public:
virtual void print() {cout << "base" << endl;}
static shared_ptr<base> create(const string& plugin) {
int realFlags = RTLD_LAZY|RTLD_GLOBAL;
void* handle = dlopen(plugin.c_str(), realFlags);//打开库
if (!handle) {
const char* err = dlerror();
cerr << "Can not open file " << plugin << "since " << err << endl;
return shared_ptr<base>();
}
funcCreatClass createFunc = (funcCreatClass)dlsym(handle, "createInstance"); //加载库中生成子类对象的函数
if(!createFunc) return shared_ptr<base>();
else return createFunc();
}
};
#endif // BASE_H
drive.cpp
#include "base.h"
using namespace std;
class drive : public base {
public:
virtual void print() {cout << "drive" << endl;}
};
USE_MAPFUSION_PLUGIN(drive) //展开base.h中的宏来生成产生子类对象的函数
main.cpp
#include "base.h"
using namespace std;
int main(int argc, char *argv[])
{
shared_ptr<base> a = base::create("libdrive.so");
a->print();
}
运行结果
$ mkdir build
$ cd build
$ camke ..
$ make
$ ./test
///输出
//drive
C++加载动态库的形式来实现封装的更多相关文章
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- LoadLibrary加载动态库失败
[1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...
- 【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
- QT常用代码之加载动态库和弹出对话框
作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...
- Windows平台LoadLibrary加载动态库搜索路径的问题
一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...
- QLibrary 加载动态库
阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...
- 使用dlopen加载动态库
目录 概述 接口 C CMakeLists.txt src/main.c src/add.c ./dlopen_test C++ CMakeLists.txt src/main.cpp src/add ...
- lua加载动态库缺乏相应的系统库
错误信息: 使用lua测试lm2动态库时,加载时出现如下错误 jfyuan@jfy11-B85M-D2V:~/temp/service/soft/code/ginger_resty/cores/lm2 ...
- macOS下加载动态库dylib报"code signature invalid"错误的解决办法
一.现象描述 在macOS上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没 ...
随机推荐
- python 基本模块 random、os、sys
一.random模块 所有关于随机相关的内容都在random模块中 import random print(random.random()) # 0-1⼩数 print(random.uniform( ...
- Eclipse的各种查找,类的查找,方法查找快捷键
eclipse开发中,查找会是一个经常用到的功能所以总结一下1,查找一个类 Shift + Ctrl + h 这种方式能快速的定位接口,类还有注解在那个包里面2.综合查找 Ctrl + H 这是一种综 ...
- Python学习之装饰器进阶
函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...
- centos7下安装docker(17.1docker监控---sysdig)
sysdig是一个轻量级的系统监控工具,同时原生支持容器.通过sysdig我们可以近距离观察linux操作系统和容器的行为 Linux上有很多常用的监控工具,比如;strace,tcpdump,hto ...
- C++ 星号* 与 引用&
星号 * 1. 声明的时候有*, 表示指针变量 int *p=&a;// '&'的作用就是把a变量在内存中的地址给提取出来 2. * +地址, 表示地址操作符 3. 数字*数字, 表示 ...
- Visual Studio Code 支持TensorFlow配置支持
首先选择解释器 选择TensorFlow版本的conda版本 (当然你如果是通过python单独安装的TensorFlow也可以) 编辑器输入代码,进行测试 import tensorflow as ...
- [HEOI2016/TJOI2016]排序
嘟嘟嘟 首先这题的暴力是十分好写的,而且据说能得不少分. 正解写起来不难,就是不太好想. 根据做题经验,我想到了给这个序列转化成01序列,但是接下来我就不会了.还是看了题解. 因为查询只有一个数,所以 ...
- 路飞学城-Python开发集训-第2章
学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...
- 转发 .Net平台下ActiveMQ入门实例 https://www.cnblogs.com/madyina/p/4121458.html
1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...
- git&github入门使用
一.在Linux上安装Git 首先,你可以试着输入git,看看系统有没有安装Git,没有就yum一个,反正也是自己玩玩 二.版本库创建 什么是版本库呢?版本库又名仓库,英文名repository,你可 ...