想要不依赖QT环境,在其它电脑里直接双击exe文件就可以运行当前程序。具体打包过程如下:
-
使用QT编译出release版本的exe
-
release版本运行无误后,需要找到当前构建生成的exe所在文件夹
可以看到具体目录在这里
我在该目录下的bin文件夹里找到了可执行的exe文件
-
在其它地方新建一个文件夹,将该exe文件复制进去
-
在开始菜单中找到Qt命令终端,(需要与刚刚构建时使用的版本一致),然后打开(最好不要以管理员身份运行,听说以管理员运行会优先找系统环境变量里的可执行文件,而不是当前目录下的可执行文件。)
-
将目录切到刚刚新建的文件夹下
-
执行指令windeployqt InertSim.exe,也就是
windeployqt+空格+exe的名字
但是会报错,说找不到一个依赖库。是关于QtCharts的一个dll,我在代码里确实用到了Charts来画图。
我在所给的目录下确实没有找到Qt5Charts_conda.dll,全局搜索了一下,发现只有在D:\anaconda3\Library\bin目录下有该dll
注意一下,这个QtCharts的后缀是conda。我在这里用Qt跟conda没有什么关系。也就是如下这两个软件都存在于我的电脑,但是两个并没有什么关联,一个是搞C++的,一个是搞Python的。
原因:
Anaconda 中环境带有pyqt包时,可能通过环境变量查找到相关bin目录,并在其中寻找依赖库,从而冲突
解决:
请看这位博主的文章。。https://blog.csdn.net/cramming/article/details/129672845
我觉得该博主记录的有道理,但是我改了后电脑也重启了,还是不行,会报同样的错误,也不知道是什么原因。
所以我换了一个没有anaconda只有qt的电脑进行运行windeployqt InertSim.exe打包,最后是成功的。
-
我们看看刚刚新建的目录,可以看到多了很多文件,这些文件都是windeployqt自动检索到运行InertSim.exe需要的配合文件,会自动复制到这里。
-
如果自己的程序里没有引入其它外部文件,就可以直接双击这个exe运行了。到此打包过程已经完全结束。
但是我的代码里还要读入其它文件才能配合运行,比如在之前QT编译出来的exe的同级目录下就有我引入的外部DualSPHysics文件夹和ParaViewFilters.xml文件。
所以现在也需要把它们复制到我新建的文件夹下
如果还引入了其它dll,一定要添加全,要不然在其他人的电脑里运行会报错,有时候会直接报错缺少哪个dll(报错类型1),有时候会报一串代码序号(报错类型2)。如下图,都是我遇到的报错,都是因为dll引入不全或者不正确。
引入dll齐全后,现在双击InertSim.exe就可以运行啦!自己测试,直接发送到别人没有安装QT的电脑里也可以打开运行!
----------------------------------------------------------------------分隔符-----------------------------------------------------------------------
现在的可执行文件也就是InertSim.exe是和所有需要的文件夹还有dll在一起的。如果想要把所有内容都打包成一个可执行文件,需要借助Enigma Virtual Box进行打包成一个独立的文件。
如图,我只用给别人发送这一个InertSim_boxed.exe,别人双击这个就可以运行了,而不需要在我的打包文件夹里再去找入口exe去启动。
具体过程如下:
- 官网下载Enigma Virtual Box:https://enigmaprotector.com/en/downloads.html
下载完之后双击安装,安装中除了根据自己的需求要修改一下安装目录(默认安装在C盘,我把它改到了D盘),其它没有什么要注意的。 - 等安装完之后打开该软件。
默认是英语界面,切换到中文,然后重启该软件生效。
- 选择待封包的主程序,就选择已经打包好的InertSim.exe。(这里的“已经打包好的”指的是,经过windeployqt指令的目录下的InertSim.exe),然后选择好之后,下边的封包程序另存就会默认自动生成,自己也可以给改名或者改路径,都不影响,我这里就保持默认的。
- 选择要一起打包的文件。在左下角的增加里点击增加文件夹[递归]
然后把目录选到InertSim.exe的父目录,也就是release文件夹里的所有内容都会递归增加进打包程序里。
在弹出的框里直接保持默认就好,点击确定
然后就可以看到这里出现了所有要打包进程序的文件。
- 压缩文件。在右下角点击文件选项,然后勾选压缩文件
- 最后一步:执行封包
等待封包的过程,完成后就可以看到独立打包的文件
现在只用把这个单独的InertSim_boxed.exe文件发到别人电脑就可以使用啦!