超级好用的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函数打开另一个动态库。

总结

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

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

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

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

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

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

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


相关文章
|
4月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
110 6
|
4月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
144 10
|
1月前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
47 11
|
4月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
99 5
|
4月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
95 1
|
5月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
63 6
|
5月前
|
安全 C++
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
101 5
|
5月前
|
缓存 网络协议 Linux
超级好用的C++实用库之套接字
超级好用的C++实用库之套接字
50 1
|
5月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
204 1
|
5月前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
163 0