目录
- 1、 问题介绍
- 2、 问题分析
- 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,必须选择相同的运行时库;