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、_DLLMSVCRT.lib多线程、Release、DLL版本的运行时库
/MDd_DEBUG、_MT、_DLLMSVCRTD.lib多线程、Debug、DLL版本的运行时库
/MT_MTLIBCMT.lib多线程、Release版本的运行时库
/MTd_DEBUG、_MTLIBCMTD.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,必须抉择雷同的运行时库;