能否通过delay-load或LoadLibrary调用QT DLL以降低程序内存占用?
Qt 5.6 DLL按需加载方案解答
方案可行性说明
两种方式都可以实现按需加载Qt DLL,具体适配细节如下:
- 延迟加载(delay-load)方案
这是最推荐的实现方式,不需要修改现有业务逻辑,仅需要调整项目链接配置即可生效。以MSVC编译器为例,只需要在项目属性的链接器-输入页面,将Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll等不需要启动加载的库添加到「延迟加载的DLL」列表中。程序启动时不会加载这些DLL,只会在第一次调用到Qt相关接口时自动触发加载,完全不需要额外处理加载逻辑。
注意事项:调用Qt相关接口前不要操作Qt的元对象资源(比如实例化带Q_OBJECT宏的类、连接信号槽),否则会触发空指针报错。如果需要卸载DLL释放内存,要确保所有Qt对象已经销毁、QApplication实例已经正常退出后再执行卸载操作。 LoadLibrary手动加载方案
该方案可以实现,但开发成本更高。Qt的C++接口存在大量名称修饰,直接通过GetProcAddress获取导出函数地址的操作非常繁琐,不推荐直接调用LoadLibrary加载Qt官方DLL。
如果你需要完全手动控制加载逻辑,可以将所有Qt UI相关的逻辑封装到一个独立的自定义DLL中,该自定义DLL正常链接Qt库,主程序仅在需要展示UI的时候调用LoadLibrary加载这个自定义DLL,调用它的导出接口完成UI展示即可,不需要直接处理Qt的复杂导出符号。
额外优化提示
如果你的程序后续很长时间不需要再使用UI,可以在退出UI逻辑、销毁所有Qt资源后,卸载对应的Qt DLL,完全释放这部分内存占用。
内容的提问来源于stack exchange,提问作者Herlin Drew
相关产品推荐
相关产品推荐

