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上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没 ...
随机推荐
- InfluxDB基本概念和操作
InfluxDB基本概念 1.数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value).格式如下: 1 cpu_us ...
- js 文件引用传递参数
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code (function() {var hm = document.createElement(&q ...
- SQL优化工具SQLAdvisor使用
一.简介在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑优 ...
- CustomScrollView + slivers + SliverAppBar
import 'package:flutter/material.dart'; void main()=>runApp(MyApp()); class MyApp extends Statele ...
- ESP8266开发综合篇第十四节(LUA)-8266作为TCP服务器,Android客户端连接,显示温湿度,控制继电器
前几节先略过,我先补充上大部分人迫切的需求 编写Android TCP客户端 用Android Studio 先做一下界面 然后放一个输入对话框,因为没有显示出来这个控件.所以就手写 剩下的自己研究 ...
- phpstorm 免费激活码
打开网址 http://idea.lanyus.com/ 选择获取注册码,复制生成的验证码 安装完成后,打开软件,依次选择菜单栏 Help -> Register-> Activation ...
- java将秒转换为时分秒工具类
需要一个接收时分秒的对象,如下: package com.dq.schoolcontract.utils; import com.sun.media.jfxmedia.control.VideoRen ...
- hackbar增强版 & 在Firefox上安装未通过验证的扩展
hackbar是Firefox的经典插件之一.介绍如下(懒得翻译了) This toolbar will help you in testing sql injections, XSS holes a ...
- Mysql数据库表被锁定处理
1.查进程,查找被锁表的那个进程的ID show processlist; command 为waitting的就是锁住的表,info为执行某条语句的信息,id为进程. 2.kill掉锁表的进程ID ...
- WPF PasswordBox不支持绑定解决方法
原文:WPF PasswordBox不支持绑定解决方法 PasswordBox的Password属性因为安全原因不支持直接绑定,可以使用依赖属性实现.直接插入代码 public class Passw ...