用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利用动画实现背景逐渐变暗