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

发布于:2024-05-06 ⋅ 阅读:(26) ⋅ 点赞:(0)

概述

        在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函数打开另一个动态库。

总结

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

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

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

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

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

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

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