标题
[qt]win64下打包qt5.12.12的正确方法
clq
浏览(481) +
2022-06-07 12:45:20 发表
编辑
关键字:
[qt]win64下打包qt5.12.12的正确方法
1.
直接运行然后按提示复制 dll 过来的方式其实只在本机有效。所以实际上是错误的。
运行时程序还是会去找安装版本 qt 的 dll 。
很可能是根据路径 QT_QPA_PLATFORM_PLUGIN_PATH 变量去找的。
所以要把安装版本 QT 的文件夹改名后再进行测试。
不过,在 cmd 下用 set 命令并没有显示 qt 所在的路径。所以这有可能是写在注册表或者是别的什么位置的。
不过应该没有在系统路径复制了一份 qt 运行环境,因为修改安装的 qt 路径后默认的程序也是报这个错误的。
2.
错误信息为
“This application failed to start because no Qt platform plugin could be init”
搜索的话还会找到很多方法。不过大概是 qt 版本的原因,大多用不上。另外 liteide 的 qt5 环境也是不兼容的。
3.
还有一个网上常见的解决方法 windeployqt.exe
用Qt部署工具windeployqt.exe来检测运行该exe所需动态库,运行命令很简单(最好先 cd 进入目标目录):
windeployqt.exe 目标.exe
运行完成后,目标.exe同级目录中就会出现其依赖库了,相关的plugins和platform文件夹与动态库都会拷贝在该目录下。
理论上是没错的,但这样复制出来的一些运行 dll 不知为何会有错(其实是不知从哪里另外复制了一个版本的过来),这
会导致程序启动仍然出错。其实替换成 qt 安装目录下的这些 dll 文件就可以了。但这里有个问题,这么多 dll 实在不知道怎么替换
才好。linux 下是可以查看正常运行时的程序使用了哪些 so 库的,但 windows 下似乎没有直接的方法。
不过幸好 windows 有个特点,使用中的 dll 是不能删除的。所以可以用来代替 linux 的这个功能。
方法是将全部 qt 目录下的 bin 文件包括各个 dll 及不是 dll 的文件都复制一份到目标目录,这时候肯定是可以运行的(很大,3.5g 以上)
仍然选中所有的 dll (注意不要选中其他文件),然后删除。删除不了的就是需要的部分了。
4.
删除了根目录的 dll 还是不够的。plugins 目录也有近一个 G ,那么那些 plugins 中的目录是需要的呢?
其实就是上一步 windeployqt.exe 复制过去的那些目录。
这样我们也就知道了,原来不一定要有 plugins 目录,可以把他们直接当做程序的子目录就行。但是因为我们前一步运行库是从 qt 安装版复制
过来的,它还复制了一个叫 qt.conf 的文件。qt 编译出来的程序默认会去它里面找 plugins 的目录,所以我们要删除掉这个文件。
5.
这样折腾一番下来后,程序可以正确运行了。不过你会惊奇地发现目录文件几乎和 windeployqt.exe 结果的一样嘛。为什么 windeployqt.exe
出来的就是不行(当然有些人的环境是可以的)?
仔细对比一下这些同名的文件,会发现大小不一样,显然是用了另外一个版本的,至于是怎么来的估计是各种路径配置导致的。以后再深究吧。
总之我们直接用安装目录下的就好了。
6.
目前是可以用安装目录的这两个文件替换掉 windeployqt.exe 生成的就可以了
libstdc++-6.dll
Qt5Core.dll
不过不知道以后的 qt 版本或者是其他人的环境会不会一样,估计是不太会。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.