-
Notifications
You must be signed in to change notification settings - Fork 7
Plugin
技术实现代码
屏蔽不同系统的宏/接口,保证可以在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