超级好用的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函数打开另一个动态库。
总结
使用动态库具有如下几个优点。
资源共享:多个进程可以共享同一份库的副本,从而节省内存空间。
升级便捷:只需替换库文件即可更新所有依赖该库的应用程序功能,无需重新编译链接。
模块化:有利于软件架构的模块化设计和部署。
当然,使用动态库也有自身的一些缺点,主要有如下两点。
依赖问题:程序运行时,必须能找到对应的动态库文件。否则,会因找不到库而导致运行失败。
性能开销:首次加载库会有一定的性能损耗,包括查找、加载以及解决符号依赖等。