我正在寻找(并且肯定我不是唯一一个)在Windows上构建基于MinGW的64位Qt程序的最直接方式。直线向前意味着最小的努力和时间(例如用于建造和设置)。目前,我使用MinGW / OpenGL和QtCreator运行qt-project.org网站的常规官方开发环境,适用于Windows 32位。当然我已经阅读了qt-project.org的(未完成的...)64位维基页面,我也阅读了不同的stackoverflow问题,但我仍然感到困惑。我知道如何在其他帖子中处理如何构建64位Qt的主题,但这不是我的问题,我需要的是概述和最有利的64位MinGW端口。
让我感到困惑的一件事是,来自mingwbuilds sourceforge项目的“x64-Qt-5.2.1 + QTCreator-3.0.1-(gcc-4.8.2-seh).7z”包中的DLL似乎是32位。
为了澄清我的问题,我还要问一些相关的问题:
非常感谢你的帮助。
更新3/11/2019:从Qt 5.12开始,Qt Project在64位模式下正式支持MinGW-w64。您可以从Qt安装程序安装它,或者自己从Qt的源代码构建它们(它们已经解决了阻止成功构建的问题)。
事先更新:我认为rubenvb's answer现在是这个问题的最佳答案:MSYS2包含一个用MinGW-w64构建的最新Qt,这是构建64位Qt应用程序所需要的。我建议在rubenvb的答案中使用Qt wiki链接进行部署;它大大改善了。
我建议从Qt64-NG project安装你的Qt版本。
该项目使用MinGW-w64提供最新的x64 Qt版本。 MinGW-w64项目的GCC编译器也包含在安装程序版本中(但不包含在7z中)。您将需要在MinGW-w64中使用相同版本的GCC来构建Qt以构建您自己的应用程序,因此我建议您选择安装程序。
您需要选择具有所需异常堆栈帧展开方法的构建。问题What is difference between sjlj vs dwarf vs seh?描述了Qt的不同构建中存在的异常处理程序类型之间的差异。在GCC 4.8发布之前,SJLJ是唯一的选择,但后来的GCC版本支持SEH。虽然SEH更有效,但任何一种选择都可行。
安装Qt之后,可以将Qt / qt-ver / qt-ver / bin和Qt / qt-ver / mingw64 / bin目录添加到环境变量中的User或System Path变量中,这样就可以使用MinGW -w64的GCC用于从您首选的构建过程构建。执行此操作后,Qt Creator将自动检测MinGW-w64作为已安装的编译器。
如果您不想添加到路径中,可以手动为Qt Creator设置的版本指定编译器。您可能需要通过选择选项>构建和运行下的qmake.exe来添加Qt版本。您还需要在Build&Run> Debuggers选项卡下选择gdb.exe作为调试器。它将位于Qt / qt-ver / qt-ver / mingw64 / bin。
您可以将MinGW-w64工具链与其他工具链交换。要在Qt Creator中执行此操作,您可以在套件之间创建和交换。
您可以使用Qt64-NG构建进行开发和部署。要进行部署,您需要打包应用程序需要与您的应用程序一起运行的文件,这样您的最终用户就不必再执行任何额外的安装步骤。
首先,创建一个部署文件夹(可能带有您的应用程序名称)并将应用程序exe文件复制到该文件夹。如果您正在使用Qt Creator,则可以在侧栏的“项目”选项卡中或应用程序的.pro文件中找到应用程序exe的路径(如果在此处指定)。
有两种方法可以复制运行应用程序所需的dll依赖项。您可以手动复制所需的文件,也可以使用windeployqt,这是Qt安装提供的程序,它将自动复制(大部分)所需的依赖关系,以便部署到刚创建的应用程序部署文件夹。
将以下dll文件从Qt / qt-ver / qt-ver / bin和Qt / qt-ver / mingw64 / bin文件夹复制到应用程序部署文件夹。一些dll文件将位于两个文件夹中,并且任一位置都可以使用:
icudt54.dll
icuin54.dll
icuuc54.dll
libgcc_s_sjlj.dll or libgcc_s_seh.dll (corresponds with chosen stack unwinding method)
libssp-0.dll
libstdc++-6.dll
libwinpthread-1.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
您还需要包含与您在项目中使用的Qt模块相对应的任何Qt5 * .dll文件。
接下来,您需要复制Qt所需的任何插件DLL文件。 Qt将默认在应用程序部署文件夹/插件中查找插件。您可以在Qt / qt-ver / qt-ver / plugins中找到要复制的插件文件夹。例外的是platforms文件夹,它将尝试在您的应用程序部署目录/平台上找到它。以下目录结构指示复制最小项目的文件的位置。将任何其他所需的插件(包括包含文件夹)复制到deployment / plugins文件夹。
/部署
/platforms
/plugins
icudt54.dll
icuin54.dll
icuuc54.dll
app.exe
libgcc_s_seh-1.dll
libssp-0.dll
libstdc++-6.dll
libwinpthread-1.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
/部署/平台
qwindows.dll
/部署/插件/ imageformats
qjpeg.dll
您可以在Qt / qt-ver / qt-ver / bin文件夹中找到windeployqt.exe。 Windeployqt要求您的Qt / qt-ver / qt-ver / bin和mingw64 / bin文件夹位于用户或系统路径变量中才能正常工作。
要使用windeployqt,请打开命令窗口并切换到应用程序部署目录。可以在Qt Deployment找到运行它的语法。您可能希望按如下方式运行它:
windeployqt.exe app.exe
Windeployqt(Qt 5.4.1)会将您的imageformats和iconengines插件文件夹复制到应用程序部署目录级别而不是插件文件夹中。这是正确的位置,因为它改变了Qt查找这些文件夹的位置。
您可以通过在未安装Qt开发库的计算机上和路径中运行应用程序来测试您是否拥有正确的文件。如果您的应用程序启动时没有错误,您将知道Qt找到了所需的依赖项,并且您可以将应用程序打包以进行分发。
如果您遇到错误,请参阅Tripleboot deployment guide。您还可以尝试使用Process Explorer来查看应用程序在提供依赖项缺失错误时尝试加载的依赖项。
应用程序经常与归档和/或安装程序一起分发。 Qt Installer Framework提供了一种方便的方法来打包您的Qt应用程序以作为安装程序可执行文件进行分发。
您可以安装MSYS2,其中包括软件包管理器和包含Qt的软件包加载的预构建版本,您也可以在MSYS2环境之外使用,例如: Qt Creator(顺便说一下,它也在存储库中)。
安装很简单:
<msys2>/mingw{64,32}/bin
中,可从相应的命令提示中访问。以同样的方式,您可以安装开发所需的数百个其他库和工具。
至于应用程序部署的其余部分,我建议您使用the Qt project wiki page on Windows deployment。