windows、macosx 动态 加载 动态库 C++类封装

这篇博客旨在介绍如何封装一个C++模板类,以便在Windows和macOS X上方便地动态加载和调用动态库。文章详细阐述了关键知识点,包括Windows上的LoadLibraryExW、GetProcAddress和FreeLibrary函数,以及macOS X上的dlopen、dlclose函数。此外,还讨论了可变参数模板函数和如何在不同平台上调用示例。
摘要由CSDN通过智能技术生成

目的

为了方便在windows平台或者mac、osx平台上调用动态库,封装一个C++基础模板类,实现动态库加载,函数获取以及直接调用,直接调用时只要传入函数名成和参数即可

因为要兼容windows 和mac 平台我们定义两个宏做编译区分
defined(OS_WIN)
defined(OS_MACOSX)

关键知识点

windows 加载动态库使用到的函数 LoadLibraryExW,GetProcAddress,FreeLibrary
macosx 加载动态库使用到的函数 dlopen,GetProcAddress,dlclose
可变参数模板函数
std::result_of<std::function(Args…)>::type
std::forward(args)…

代码

三个文件shared_library.h shared_library.cc shared_library.mm

头文件

class  SharedLibrary
{
   
public:
    SharedLibrary();
    ~SharedLibrary();
public:
    //加载动态库dll或者dylib
    bool Load(std::string str_utf8_dllfilepath);
    //获取动态库中的函数指针
    //通过函数模板适应所以函数类型
    template <typename T>
    T* GetFunction(const std::string _funcName)
    {
   

        T* _funcPtr = nullptr;
#if defined(OS_WIN)
        //windows 中通过GetProcAddress 获取函数地址
        auto _ptr = GetProcAddress((HMODULE)libraryHandle_, _funcName.c_str());
        _funcPtr = (T*)_ptr;
#endif
#if defined(OS_MACOSX)
        //Mac dlsym 获取函数地址
        auto _ptr = (T*)dlsym(libraryHandle_, _funcName.c_str());
        _funcPtr = (T*)_ptr;
        const
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值