重新着手使用自己笔记本上配的工作环境
在实习中,需要对Qt程序进行打包:
-
在Qt creator 中 修改为 release 编译
-
进入release 生成的项目目录,新建一个目录,把可执行文件复制进去
-
进入新建的目录,在命令行下 执行 windeployqt XXX.exe
-
即可在新建的目录中收集该 程序需要的动态/静态 链接库。
-
debug下,库配置正确,运行正常无问题。
-
release下,库配置也正确,但是在生成完要运行时,出现问题:
第一反应是tbb.dll的路径配置不正确。于是查看系统设置下环境变量中的path项下是否正确输入了tbb.dll所在路径。查看后发现无误,而且确实应该无误,如果有错误的话那么debug版本的dll也会出现类似的问题。
然后尝试 把path路径下的tbb.dll文件拷贝至项目的可执行文件.exe所在的路径下,重新运行项目,发现运行成功了。
这下更奇怪了。感觉是默认运行的时候调用的tbb.dll文件不是我希望调用的版本。超出能力范围了,需要求助。
<style>
p {
color: red;
}
</style>
<p>1. 在stackoverflow上,找到了一篇对于“无法定位程序输入点”问题有较好描述的帖子
**其中提到,出现这种错误,很大可能是因为,在生成exe时所使用的lib文件的版本,和在运行exe时所调用的dll的版本不一致。**</p>
考虑到我在生成exe时使用的lib对应的dll文件确实存在,但没有得到正确的调用,所以必须了解exe文件在运行时寻找和调用dll文件的搜索路径。
2. 通过百度查找到该博文 dll目录查找顺序
文中阐明了可执行文件在运行时寻找和调用dll文件的路径搜索顺序。一般是:
A 可执行文件所在目录;
B 进程当前目录;
C 系统目录,%SystemRoot%/system32
D 16位系统目录;,%SystemRoot%/system
E Windows目录,%SystemRoot%/
F 环境变量PATH中的目录;
果不其然,我在自己电脑的C:\Windows\System32文件夹下发现了另外的dll。。。。不知道啥时候自带的呢,额,替换之或删除之,问题即可解决
我最后的解决方案:由于本地安装了Qt5,并且已经设置系统环境,也装了mingw64,也设置了系统环境,出现的问题是:qt creator 编译器使用Qt5 下的mingw把项目进行了编译,而我在文件目录中直接运行exe文件调用的是mingw64的dll动态链接库,可能是两个库的版本不同导致以上问题的发生。最后我在环境变量中删除mingw64的路径,重新点击exe,运行成功。
3.通过2中的博文,可以看到利用filemon监视工具是个观察搜索路径顺序的不错工具
有空参见 filemon监视工具的使用,今天受限于时间先略过。
4.如下两篇msdn上的资料帮我重新梳理了windows下动态链接库调用方面的知识,在此一并表示感谢
https://msdn.microsoft.com/zh-cn/library/253b8k2c.aspx
https://msdn.microsoft.com/zh-cn/library/7d83bc18.aspx