乐趣区

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

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,必须抉择雷同的运行时库;
退出移动版