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