用C++面向对象的方式动态加载so的方法
发布时间 - 2026-01-10 22:14:19 点击率:次这几天在写一个server,由于框架相同,仅仅是获取数据源的地方有区别,所以,研究了一下如何使用面向对象的方法来动态加载so。

主要思想就是:
1.通过一个函数能够获得一个基类的指针,这样在调用基类的函数的时候,就能自动调用子类的实现了。
2.存储so对象的指针应该是外层类的一个static变量。
详细还是看代码吧:
1)首先定义一个公共的头文件,里面存储的基类的定义:(需要注意的就是,只要不是纯虚函数,那么就一定要有实现;还有就是析构函数需要为虚函数)
so和主调程序都需要包含这个头文件。
source_base.h
#ifndef _SOURCE_BASE_H_
#define _SOURCE_BASE_H_
#include <iostream>
using namespace std;
class CSourceBase;
/**
* @brief 获取实例
*
* @param client new出的指针
*
* @return 0 succ
* else fail
*/
extern “C” int CreatObj(CSourceBase *& client);
class CSourceBase
{
public:
CSourceBase(){};
virtual ~CSourceBase(){};
public:
virtual int GetFriends(int iUin,char *data,int &iLen,int maxLen)
{
return 0;
}
};
#endif
2)我们来看so的实现
xy_source.h
#ifndef _XY_SOURCE_H_
#define _XY_SOURCE_H_
#include <iostream>
#include “sourcebase.h”
using namespace std;
class CXY_Source:public CSourceBase
{
public:
CXY_Source();
virtual ~CXY_Source();
{}
int GetFriends(int iUin,char *data,int &iLen,int maxLen);
};
#endif
xy_source.cpp
#include “xy_source.h”
int CreatObj(CSourceBase *& client)
{
client = new CXY_Source();
return 0;
}
CXY_Source::CXY_Source() { }
CXY_Source::~CXY_Source() { }
int CXY_Source::GetFriends(int iUin,char *data,int &iLen,int maxLen)
{
return 0;
}
3)调用者的实现
这里说明一下,因为这里想要对外封装成透明的,所以,采用了如下的方式。
xy_client.h
#ifndef _XY_CLIENT_H_
#define _XY_CLIENT_H_
#include <iostream>
#include “sourcebase.h”
using namespace std;
typedef int (*FunPtr)(CSourceBase *& client);
class CXY_Client
{
public:
static void *SoObj;
public:
CXY_Client();
virtual ~CXY_Client();
//载入so
int Init(const char * soname);
int GetFriends(int iUin,char *data,int &iLen,int maxLen);
private:
CSourceBase *m_Client;
};
xy_client.cpp
#include “xy_client.h”
void* CXY_Client::SoObj=NULL;
CXY_Client::CXY_Client()
{
m_Client = NULL;
}
CXY_Client::~CXY_Client()
{
if(m_Client)
{
delete m_Client;
}
}
int CXY_Client::Init(const char * soname)
{
string strSoName;
if(soname==NULL)
{
strSoName = “../lib/xysource.so”;
}
else
{
strSoName = soname;
}
if(strSoName.size()==0)
{
strSoName = “../lib/xysource.so”;
}
if(CXY_Client::SoObj == NULL)
{
SoObj=dlopen((char*)strSoName.c_str(),RTLD_LAZY);
if(SoObj==NULL)
{
return -1;
}
}
if(m_Client==NULL)
{
FunPtr func;
func = (FunPtr)dlsym(SoObj, “CreatObj”);
int ret = (*func)(m_Client);
if(ret)
{
return -2;
}
}
return 0;
}
int CXY_Client::GetFriends(int iUin,char *data,int &iLen,int maxLen)
{
return m_Client->GetFriends(iUin,data,iLen,maxLen);
}
OK,到此为止代码就结束了,大家可能会发现我没有调用dlclose,这是因为static变量没有必要来调用,在进程结束时会自动释放句柄,当然如果需要有释放的应用场景的话,可以通过增加计数来实现。
另外由于上面的这个实例是从项目中抠出来的,所以并不能直接编译,还望大家见谅。
但是在这里可以下载到一个简单的可编译实例,可以用来作为实现so动态加载编程的第一步~~
以上就是小编为大家带来的用C++面向对象的方式动态加载so的方法全部内容了,希望大家多多支持~
# c
# 动态加载so
# C++动态加载so/dll库的实现
# 加载
# 面向对象
# 头文件
# 在这里
# 就能
# 子类
# 句柄
# 是从
# 可以通过
# 采用了
# 仅仅是
# 这几天
# 到此为止
# 并不能
# 这是因为
# 来实现
# 方法来
# 可以下载
# 如何使用
# 需要注意
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
晋江文学城电脑版官网 晋江文学城网页版直接进入
如何续费美橙建站之星域名及服务?
微信小程序 HTTPS报错整理常见问题及解决方案
如何快速搭建FTP站点实现文件共享?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何快速生成高效建站系统源代码?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
javascript中对象的定义、使用以及对象和原型链操作小结
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
西安专业网站制作公司有哪些,陕西省建行官方网站?
C语言设计一个闪闪的圣诞树
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Linux系统运维自动化项目教程_Ansible批量管理实战
微信小程序 闭包写法详细介绍
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
EditPlus中的正则表达式 实战(2)
香港服务器网站推广:SEO优化与外贸独立站搭建策略
JavaScript如何操作视频_媒体API怎么控制播放
青岛网站建设如何选择本地服务器?
专业商城网站制作公司有哪些,pi商城官网是哪个?
使用C语言编写圣诞表白程序
如何在腾讯云服务器快速搭建个人网站?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
轻松掌握MySQL函数中的last_insert_id()
使用Dockerfile构建java web环境
Windows Hello人脸识别突然无法使用
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
如何在IIS管理器中快速创建并配置网站?
在centOS 7安装mysql 5.7的详细教程
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何注册花生壳免费域名并搭建个人网站?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何快速辨别茅台真假?关键步骤解析
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何确保西部建站助手FTP传输的安全性?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
如何快速使用云服务器搭建个人网站?
iOS正则表达式验证手机号、邮箱、身份证号等
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel如何实现文件上传和存储?(本地与S3配置)
Android利用动画实现背景逐渐变暗

