目录结构

└── 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++加载动态库的形式来实现封装的更多相关文章

  1. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  2. LoadLibrary加载动态库失败

    [1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...

  3. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  4. QT常用代码之加载动态库和弹出对话框

    作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...

  5. Windows平台LoadLibrary加载动态库搜索路径的问题

    一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...

  6. QLibrary 加载动态库

    阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...

  7. 使用dlopen加载动态库

    目录 概述 接口 C CMakeLists.txt src/main.c src/add.c ./dlopen_test C++ CMakeLists.txt src/main.cpp src/add ...

  8. lua加载动态库缺乏相应的系统库

    错误信息: 使用lua测试lm2动态库时,加载时出现如下错误 jfyuan@jfy11-B85M-D2V:~/temp/service/soft/code/ginger_resty/cores/lm2 ...

  9. macOS下加载动态库dylib报"code signature invalid"错误的解决办法

    一.现象描述 在macOS上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没 ...

随机推荐

  1. 前端数据库——WebSQL和IndexedDB

    一.WebSQL WebSQL是前端的一个独立模块,是web存储方式的一种,我们调试的时候会经常看到,只是一般很少使用.并且,当前只有谷歌支持,ie和火狐均不支持. 我们对数据库的一般概念是后端才会跟 ...

  2. js开发打印证书功能(二)

    在上一篇的基础上,实现了一下另外一种方式. 上一篇地址:https://www.cnblogs.com/ljwsyt/p/9525290.html 首先,该方式也是有几种方法. 1.在上一篇的基础上, ...

  3. vuejs2+webpack2+vuxui2多页面架手脚,支持二级目录

    const UglifyJsPlugin = require('uglifyjs-webpack-plugin') // 去console插件 const CompressionWebpackPlug ...

  4. C#编程の模板

    C#泛型编程已经深入人心了.为什么又提出C#模板编程呢?因为C#泛型存在一些局限性,突破这些局限性,需要使用C#方式的模板编程.由于C#语法.编译器.IDE限制,C#模板编程没有C++模板编程使用方便 ...

  5. CSS--position:relative和position:absolute

    position:relative相对定位 1. 如何定位?每个元素在页面的普通流中会“占有”一个位置,这个位置可以理解为默认值,而相对定位就是将元素偏离元素的默认位置,但普通流中依然保持着原有的默认 ...

  6. UVA1616-Caravan Robbers(二分)

    Problem UVA1616-Caravan Robbers Accept: 96  Submit: 946Time Limit: 3000 mSec Problem Description Lon ...

  7. ECO开放平台对接文档说明

    应用集成: http://open.teewon.net:1000/static/index.html#/docs/flow/integrate统一认证集成文档: http://open.teewon ...

  8. Bean named '*' must be of type [*], but was actually of type []

    本地Service 名字和调用别的maven项目Service重名

  9. (1)ESP8266微信门铃

    http://rayuu.com/2017/11/13/esp8266-wechat-doorbell/(留做参考) 就是当门铃按键按下,微信会收到消息提醒. 若在家就算了,没在家会受到远程提示. 自 ...

  10. linux命令之vmstat

    vmstat 参数 功能:报告虚拟内存.swap.io.上下文和 CPU 统计信息. 分析了这些文件: /proc/meminfo /proc/stat /proc/*/stat 常用选项: -a 打 ...