[Qt学习笔记]Qt使用MFC编译生成dll库在无编程环境电脑出现无法加载dll的问题

目录

  • [1、 问题介绍](#1、 问题介绍)
  • [2、 问题分析](#2、 问题分析)
  • [3、 问题总结和思考](#3、 问题总结和思考)

1、 问题介绍

在项目实践中,使用Qt调用了一个vs创建的dll库,在本机上编译和release后的exe可以加载对应的dll文件,将exe拷贝到有vs编程环境的电脑上也可以加载对应的dll文件,但在无编程环境的电脑上执行exe就会出现无法加载dll的bug。

2、 问题分析

刚碰到这个问题的时候,感觉可能是dll的依赖项的确实,或者是vc运行库的缺失,如是在新电脑上安装了VC运行库,并使用dependency walker查看了该dll的依赖项并进行补全,发现问题依然存在,接下来考虑的是dll自生生成的环境依赖问题,如是找到了该dll项目的生成环境,将dll生成的运行库设置为"多线程(/MT)",再重新生成dll就解决新电脑无法加载dll的bug。

3、 问题总结和思考

这里重新学习一下MFC这种生成dll设定运行库的原理。

编译选项 包含 静态链接的lib 说明
/MD _MT、_DLL MSVCRT.lib 多线程、Release、DLL版本的运行时库
/MDd _DEBUG、_MT、_DLL MSVCRTD.lib 多线程、Debug、DLL版本的运行时库
/MT _MT LIBCMT.lib 多线程、Release版本的运行时库
/MTd _DEBUG、_MT LIBCMTD.lib 多线程、Debug版本的运行时库
这里就要注意/MD和/MT的区别了

/MD表示运行时库不集成,一般生成的文件小,如果系统有依赖库可有效减少文件大小。

/MT表示运行时库集成,生成文件大,自带了该dll的依赖库

/MT和/MD选择的要领

  • 1 以下情况选择/MT
    1)有些系统可能没有程序所需版本的运行时库,程序必须把运行时库静态链接上;
    2)减少模块对外界的依赖;
  • 2 以下情况选择/MD
    1)程序就不需要静态链接运行时库,可以减小软件的大小;
    2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题;
    3)用户机器可能缺少我们编译时使用的动态运行时库。(补充:如果我们软件有多个DLL,采用/MT体积增加太多,则可以考虑/MD + 自带系统运行时库)
  • 3 注意:如果软件有多个模块dll,必须选择相同的运行时库;
相关推荐
扶尔魔ocy7 小时前
【qt openGL入门笔记】windows编译MinGW版本的osgearth(2.10.1)
qt·opengl·osg
小王C语言11 小时前
Qt常用控件:按钮类控件,普通按键、单选、复选
开发语言·qt
初阳78521 小时前
【基于Qt5仿音乐播放器(六)】——细节打磨与总结
qt·1024程序员节
小鱼仙官1 天前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
扶尔魔ocy1 天前
【QT OpenGL】知识点编目及传送门
qt·opengl·osg
qq_401700411 天前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
GreenHandBruce1 天前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
誰能久伴不乏2 天前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
沫璃染墨2 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
小豆庄2 天前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程