C++自己造轮子项目——Linux下动态加载so库的一个小工具

gitee地址:https://gitee.com/dyexlzc/CppdynamicLoad/tree/master
欢迎一起更新+找BUG

CppDynamicLoad —— Linux下cpp动态加载so库

主要文件
dload.hpp 主要的实现文件
interface.h 定义统一的接口

example:

可以clone下来后使用make so,make两条指令
分别生成so和可执行文件./dl,执行./dl即可

文件1:main.cpp
编译指令: g++ main.cpp -std=c++11 -ldl -o dl
其中只加了-ldl,表明使用了系统dlfcn.h相关的库

#include <iostream>
#include <dlfcn.h>     //动态加载so所需的头文件
#include "dLoad.hpp" //获取so所继承的基类
using namespace std;
int main()
{
    dynamicLoader loader("./"); //so文件在根目录下
    loader.load("so1.so");      //加载so1.so
    interface *p=loader.getInstance("so1.so");  //获取so1.so中的实例,获得对象
    p->run();   //调用函数
    delete p;   //删除对象
    loader.unload("so1.so");    //卸载动态库
}

文件2-n…:soMaker[n].cpp
编译指令: g++ -fPIC -shared soMaker[n].cpp -o so1.so
期中-fPIC:使得编译器产生位置无关的代码,PIC就是position independent code
PIC使.so文件的代码段变为真正意义上的共享
-shared 表示告诉编译器生成so文件

#include<iostream>
#include"interface.h"
class job1:public interface{		//继承自interface接口
public:
    virtual void run(){			//重写run()接口
        std::cout<<"this is job131"<<std::endl;
    }
    ~job1(){
        std::cout<<"job1 descontruct"<<std::endl;
    }
};
extern "C"{
    interface* getInstance(){    //导出符号,必须要有的extern "C"
        return new job1;
    }    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值