共计 882 个字符,预计需要花费 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,必须抉择雷同的运行时库;
正文完