Skip to content
i0gan edited this page Apr 10, 2024 · 1 revision

C++动态加载

技术实现代码

屏蔽不同系统的宏/接口,保证可以在windows/linux/apple系统上都可以使用

动态加载DLL/SO主要分4部分加载DLL/SO库,

windows用LoadLibraryExA, linux/apple系统用dlopen获得函数地址,

windows用GetProcAddress, linux/apple系统使用dlsym执行获得的函数卸载DLL/SO库,

windows用FreeLibrary, linux/apple系统使用dlclose

动态加载优点

可以实现一个很小的主程序,主要的框架和逻辑实现都放在DLL/SO动态库里程序更新的时候,可以只更新DLL文件,而不需要编译更新所有的程序可以通过配置来加载需要的服务,组成不同的进程需求甚至可以用C++来实现热更新服务

动态加载缺点以及问题

问题一:全局变量问题plugin的DLL/SO文件所需的公共库尽可能使用.dll/.so动态库, 而不是使用.lib/.a静态库,比如a_plugin.dll,b_plugin.dll都用到了common库,如果common里有一个单件singleton,或一个类class定义了一个static变量,或一个函数定义了一个static变量,如果编译成静态库,在连接成plugin的dll时候,代码会编译进plugin的dll里,导致动态加载的时候每一个dll里都有一个单独的变量.编译成动态库就没有问题.几遍如此,如果全局变量或类中的static变量,只定义在头文件中还是会导致这个问题

问题2:C++动态库接口函数返回stl对象可能引起 ‘__acrt_first_block == header’异常 原因分析可以在这篇博客里找: https://blog.csdn.net/10km/article/details/80522287

Clone this wiki locally