超级好用的C++实用库之动态库加载器

2024-05-13 1433阅读

温馨提示:这篇文章已超过375天没有更新,请注意相关的内容是否还可用!

💡 需要该C++实用库源码的大佬们,可扫码关注文章末尾的微信公众号二维码,或搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

超级好用的C++实用库之动态库加载器
(图片来源网络,侵删)

概述

        在C++中,动态库也称为共享库或DLL,是一种可执行文件形式,其中包含可以被多个应用程序同时加载并使用的函数和数据。相较于静态库,动态库在运行时而不是编译链接阶段被程序所使用。加载动态库,在Windows和Linux操作系统下使用的API函数有所不同。

        Windows操作系统下,动态库的扩展名通常为.dll(Dynamic Link Library),可以使用LoadLibrary、GetProcAddress和FreeLibrary等函数来操作。

        Linux操作系统下,动态库的扩展名通常为.so(shared object)。使用dlopen、dlsym和dlclose等函数来加载、查找符号以及卸载动态库。

CHP_DynLoader类

        为了对应用层屏蔽Windows和Linux操作系统的差异,我们封装了CHP_DynLoader类,以提供统一的接口,便于上层进行调用。CHP_DynLoader类的头文件,可参考下面的示例代码。

#pragma once
class CHP_DynLoader
{
public:
    CHP_DynLoader();
    ~CHP_DynLoader();
    int Open(const char *pszFileName);
    void *GetFunc(const char *pszFuncName);
    void Close();
private:
    typedef void *HDynLoader;
    HDynLoader m_hLoader;
};

        可以看到,CHP_DynLoader类比较简单,只有如下三个公共接口。

        Open:打开指定的动态库。参数pszFileName为动态库的文件名,返回值为0表示成功,否则为错误码。

        GetFunc:获取指定名称的函数指针。参数pszFuncName为函数名称,返回值为函数指针,非NULL表示成功,否则失败。返回的void *可以转换为需要的函数指针形式。

        Close:关闭动态库。关闭后,可重新调用Open函数打开另一个动态库。

总结

        使用动态库具有如下几个优点。

        资源共享:多个进程可以共享同一份库的副本,从而节省内存空间。

        升级便捷:只需替换库文件即可更新所有依赖该库的应用程序功能,无需重新编译链接。

        模块化:有利于软件架构的模块化设计和部署。

        当然,使用动态库也有自身的一些缺点,主要有如下两点。

        依赖问题:程序运行时,必须能找到对应的动态库文件。否则,会因找不到库而导致运行失败。

        性能开销:首次加载库会有一定的性能损耗,包括查找、加载以及解决符号依赖等。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]