目录结构

  1. └── test
  2. ├── CMakeLists.txt
  3. ├── base.h //设置接口
  4. ├── drive.cpp //具体实现
  5. └── main.cpp //test

CMakeLists.txt

  1. cmake_minimum_required (VERSION 2.8)
  2. project (test)
  3. set(CMAKE_CXX_STANDARD 11)
  4. include_directories(./)
  5. add_library(drive SHARED drive.cpp) #将实现添加为动态库
  6. add_executable(test main.cpp) #将test生成可执行
  7. target_link_libraries(test ${CMAKE_DL_LIBS}) #链接dl库

base.h

  1. #ifndef BASE_H
  2. #define BASE_H
  3. #include <iostream>
  4. #include <memory>
  5. #include <dlfcn.h>
  6. using namespace std;
  7. //宏用在drive.cpp中生成产生子类对象的函数
  8. #define USE_MAPFUSION_PLUGIN(C) extern "C"{\
  9. shared_ptr<base> createInstance(){return shared_ptr<base>(new C());}}
  10. class base;
  11. typedef shared_ptr<base> (*funcCreatClass)();
  12. class base {
  13. public:
  14. virtual void print() {cout << "base" << endl;}
  15. static shared_ptr<base> create(const string& plugin) {
  16. int realFlags = RTLD_LAZY|RTLD_GLOBAL;
  17. void* handle = dlopen(plugin.c_str(), realFlags);//打开库
  18. if (!handle) {
  19. const char* err = dlerror();
  20. cerr << "Can not open file " << plugin << "since " << err << endl;
  21. return shared_ptr<base>();
  22. }
  23. funcCreatClass createFunc = (funcCreatClass)dlsym(handle, "createInstance"); //加载库中生成子类对象的函数
  24. if(!createFunc) return shared_ptr<base>();
  25. else return createFunc();
  26. }
  27. };
  28. #endif // BASE_H

drive.cpp

  1. #include "base.h"
  2. using namespace std;
  3. class drive : public base {
  4. public:
  5. virtual void print() {cout << "drive" << endl;}
  6. };
  7. USE_MAPFUSION_PLUGIN(drive) //展开base.h中的宏来生成产生子类对象的函数

main.cpp

  1. #include "base.h"
  2. using namespace std;
  3. int main(int argc, char *argv[])
  4. {
  5. shared_ptr<base> a = base::create("libdrive.so");
  6. a->print();
  7. }

运行结果

  1. $ mkdir build
  2. $ cd build
  3. $ camke ..
  4. $ make
  5. $ ./test
  6. ///输出
  7. //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. Openstack安装Dashboard之后,浏览器无法打开页面 500 Internal Server Error

    在手动部署Openstack时,按照官方文档安装Dashboard,并进行了配置后,发现用浏览器无法打开界面 页面显示: Internal Server Error The server encoun ...

  2. 文件IO模型

    In case of kernel-space network drivers, all three regions are mapped to kernel space, and any acces ...

  3. python入门学习:9.文件和异常

    python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件  首先创建一个pi_ ...

  4. 转://因触发器限制导致oracle用户登录失败

    使用PL/SQL DEV登录数据库时,出现如下错误 手工创建了test用户,通过dev工具登录没问题.怀疑数据库中有些用户限制了登录的.再看错误编号:ORA-20001,oracle保留的异常错误号范 ...

  5. Flask-SQLAlchemy常用操作

    一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...

  6. windows下彻底删除jenkins

    1.在控制面板中选择卸载jenkins 2.重启电脑 3.找到“.jenkins”(在C盘寻找) 4.删除“.jenkins” 5.是否要删除环境变量?(目前没删除) 6.jenkins再安装使用的是 ...

  7. ZOJ - 2423-Fractal

    A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on ...

  8. zookeepeer使用java api

    一.引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --> <dependen ...

  9. 算法相关——Java排序算法之插入排序(四)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  10. 用包来组织模型 -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 在我们使用python manage.py ...