如何在构建后在Windows上安装Qt?

22

我找不到有关在Windows上安装Qt的任何信息。
在维基文章“如何在Mac和Linux上设置Shadow Builds”中,描述了configure脚本中-prefix选项,但是这个选项在Windows上不可用。
我知道可以直接从构建文件夹中使用Qt,但是这似乎不是正确的做法,因为没有执行安装步骤。采用这种方法的问题之一是大小;Qt的构建文件夹大约占据4GB的空间,而使用二进制安装程序安装后,Qt只需要占据约1GB的空间。我猜这种差异是由于构建过程中创建的临时文件导致的。我希望有一种安装程序可以仅安装(复制)必需的文件,将临时文件留在构建文件夹中。

8个回答

28

如Ismail所说,在Windows上没有Qt的安装步骤。然而,可以通过执行以下操作来近似实现。

  1. 清理
    在构建文件夹中运行make clean以删除所有临时文件。
  2. 移动
    将构建文件夹复制到您想要安装Qt的位置。我们称之为INSTALL_DIR
  3. 修复qmake.exe可执行文件中硬编码的路径
    运行qmake -query查看编译(硬编码)到qmake中的路径,
    a. 通过使用qmake -set(1)将包含构建文件夹的路径替换为INSTALL_DIR来修复包含构建文件夹的路径。

    b. 在INSTALL_DIR的bin子文件夹中创建一个qt.conf文件,指定其中新的Qt路径。
  4. 将当前目录添加到包含路径
    在Qt提供的二进制发行版中,pwd包含在QMAKE_INCDIR中,并因此以"."的形式出现在项目的包含路径中。这在自定义构建的Qt中不会默认发生,因此您必须将以下行添加到mkspecs/YOUR-PLATFORM-HERE/qmake.conf文件中:
    QMAKE_INCDIR += "."
  5. 修复prl文件
    当您将Qt组件添加到项目文件(如CONFIG += uitools)时,Qt会查找%QTDIR%/lib/QtUiTools.prl以查找该组件的库依赖项。这些文件将具有Qt配置和构建所在目录的硬编码路径。您必须替换所有lib/*.prl文件中的构建目录为移动Qt的目录。
  • 开放源代码
    如果你进行了阴影构建(在源代码所在文件夹之外的文件夹中进行的构建),则include子文件夹中的头文件只会向前指向原始头文件。例如:BUILD_DIR\include\QtCore\qabstractanimation.h看起来像这样:
    #include "SRC_DIR/src/corelib/animation/qabstractanimation.h"
    如果你不想依赖于包含源代码的文件夹的存在,则需要将SRC_DIR/src子文件夹复制到目标文件夹中,并修复include文件夹中的所有头文件,使它们指向src子文件夹的新位置。
  • 总结:
    在Windows下构建Qt的过程使得移动(安装)Qt变得非常麻烦。您只有在没有其他更好的理由时才应该这样做。

    请记住
    简单的方法是将Qt源代码放置在您希望Qt在构建后停留的文件夹中,并在该文件夹中进行构建。这样可以避免上述步骤中除1和4以外的所有步骤。

    1)
    使用qmake -set设置的变量保存在注册表键中:
    HKEY_CURRENT_USER\Software\Trolltech\QMake\<QMAKE_VERSION>
    因此,当您希望不同的项目使用不同版本的Qt时,并且这些版本恰好具有相同版本的qmake时,您可能会遇到问题。在这种情况下,更好的解决方案是使用qt.conf文件(实际上需要为每个Qt安装创建一个文件)(选项3b)。

    许多上述信息都来自由Gabe Rudy编写的 RelocationTricks 维基页面。请查看他的Qt(Qt4)开源Windows安装程序,包括MSVC 2008预构建二进制文件的安装程序项目,该项目为您提供了解决上述问题的简单方法。

    小心使用 make clean 命令。对于我的静态构建(我不知道是否对共享构建有影响),这个命令会删除与库调试符号相关的所有 pdb 文件,因此调试变得不太信息化。我被迫重新构建 Qt。 - Pavel Strakhov
    1
    根据下面的msue,这是否已经过时了? - steventaitinger

    14

    这个答案替换了Piotr的答案中的第3步和第5步,但是根据您的需求可能仍需要他的答案中的其他步骤。

    总结一下:在将Qt目录移动到所需位置后,下载任何官方Qt 安装程序,并使用以下命令行参数运行它:

    cd <path>
    installer.exe --runoperation QtPatch windows <path> qt5
    

    <path>替换为Qt目录的完整路径(如果使用Qt 5,则为qtbase目录)。如果使用Qt 4,则省略最后一个qt5参数。

    这将修复qmake.exe、.prl文件和其他文件中的硬编码路径。它可以让你在这方面获得与官方安装程序完全相同的行为。

    对于最初的移动,nmake "INSTALL_ROOT=\somewhere" install对我而言是有效的。因此,这就涵盖了Piotr答案中的第1步和第2步。顺便说一句,我没有需要第4步或第6步。


    看起来这段代码已经在安装程序中进行了重构 - 现在在这里:pkg_tools/qt.tools/meta/installscript.qs - the_mandrill
    正如the_mandrill所说,安装程序已更改,我必须将其应用于最新的(5.3.1)安装目录,但我找不到现在的新方法。请给个提示? - iXô
    1
    @iXô 实现方式改变了,但指令没有变。同样的命令对我仍然有效。 - Oktalist
    2
    更新的路径: https://code.qt.io/cgit/installer-framework/installer-framework.git/tree/src/libs/installer/qtpatch.cpp https://code.qt.io/cgit/qtsdk/qtsdk.git/tree/packaging-tools/configurations/pkg_templates/pkg_510/qt/meta/installscript.qs https://doc.qt.io/qtinstallerframework/operations.html - Daniele E. Domenichelli

    8

    我可以在Windows上使用前缀选项配置QT 5(Visual Studio构建),例如:

    configure -prefix C:\the\path\I\want ...
    

    然后调用:

    nmake
    nmake install
    

    后者将在C:\the\path\I\want中安装Qt。

    我目前已经成功地使用Qt 5.2.1和5.3.x进行了安装,没有遇到任何问题。因此,之前可能存在的问题现在似乎已经得到解决。


    7

    很奇怪有人声称在Windows上没有“make install”。

    我已经使用过很多次,虽然它不像其他平台那样,但它确实有用。

    我如何在Windows上使用Qt的“make install”(从cmd):

    configure
    (n/mingw32-)make
    (n/mingw32-)make docs
    (n/mingw32-)make install
    

    make install命令会复制所有必要的头文件,以便能够删除源目录。请删除所有对象和不必要的内容:

    del /S /Q *.obj lib\*.dll
    rmdir /S /Q docs-build qmake tools src
    

    这将允许您删除源目录。我不知道这对调试Qt源代码有什么影响,但肯定会减小阴影构建的大小。我使用它来维护尽可能小的32位和64位构建。


    “make install” 位将复制所有必要的头文件(...)- 它们会被复制到哪里,如何设置这个位置? - Piotr Dobrogost
    1
    @Piotr:基本上,你所能做的就是在你计划安装它的地方构建它。搬迁很困难,但也许像这样的东西可以帮助你:http://tb-nguyen.blogspot.com/2010/10/how-to-move-qt-install-library.html。我记得有一个谷歌代码项目正在研究创建自己的“Qt SDK”安装程序的方法,具有自定义构建功能,但似乎找不到它了。 - rubenvb
    2
    啊,我们来了:http://code.google.com/p/qt-msvc-installer/wiki/RelocationTricks。一点也不容易... - rubenvb
    我不知道这是否适用于旧版本的Qt,但是在Qt5中,“del /s /q .obj lib.dll”会删除诸如libGLESv2.dll之类的库,这些库是Assistant和Qt Designer所需的。 - vikki
    @vikki,反斜杠在格式化中被吸收了。我已经纠正了它。我的做法是删除lib子目录中dll的副本。导入库会处理链接,而bin中的dll确保一切按预期工作。 - rubenvb
    您还可以在这些文件中查看重新分发Qt5二进制SDK的所有细节。PKGBUILD是补丁/构建脚本,.install文件是安装软件包时运行的内容。 - rubenvb

    3

    Qt 官方的构建指南 详细介绍了如何进行这项操作,通过在每个 Makefile 中进行搜索和替换实现。假设源代码已解压到 C:\qt-4.8.3 目录,并在该目录中执行构建,则需要执行以下操作:

    fart -c -i -r Makefile* $(INSTALL_ROOT)\qt-4.8.3 $(INSTALL_ROOT)\my-install-dir
    set INSTALL_ROOT=
    mingw32-make install
    

    然后创建一个配置文件,告诉qmake关于它的新安装路径。创建一个文本文件 C:\my-install-dir\bin\qt.conf:

    [Paths]
    Prefix=C:/my-install-dir
    Translations = translations
    

    最后一步(正如Randy所指出的那样),您需要修补qmake.exe,可以使用一个名为QtMove的简单实用程序来完成。这个工具还会自动更新所有的prl文件。


    1
    我认为在创建qt.conf文件时不需要打补丁。据我所知,有三种不同的方法可以修改qmake使用的路径:1. 打补丁,2. 使用qmake -set,3. 创建qt.conf文件(从最具侵入性到最不具侵入性的顺序)。 - Piotr Dobrogost

    3

    在Windows上,无法使用make install安装Qt。相反,在新的安装位置,Qt安装程序只会修补dll和pdb文件。

    我的建议是在您想要安装的位置进行影子构建。您可以手动删除*.obj文件以节省空间。


    1
    谢谢。这就是我一直在做的事情。我之所以问这个问题,是因为我很难相信在Windows上构建Qt库的用户会没有任何安装程序。 - Piotr Dobrogost
    这很遗憾,但这就是现实,我在 #qt-labs 里问了很多次 ;) - ismail

    2

    第一步:移动Qt

    • 剪切并粘贴
    • 当前目录 - C:\tools\Qt
    • 目标目录 - C:\sim\dep\Qt

    第二步:获取旧的Qt目录

    • 进入C:\sim\dep\Qt\2010.02.1\Qt
    • 打开.qmake.cache文件
    • 查找变量QT_SOURCE_TREE
    • 记下QT_SOURCE_TREE的值
    • 我的是C:\tools\Qt\2010.02.1\Qt

    第三步:修补Qt

    • 进入C:\sim\dep\Qt\2010.02.1\bin
    • 语法为qpatch.exe list oldDir newDir
    • qpatch.exe files-to-patch-windows C:\tools\Qt\2010.02.1\Qt C:\sim\dep\Qt\2010.02.1\Qt

    第四步:设置环境变量

    • set QTDIR=C:\sim\dep\Qt\2010.02.1\Qt
    • set QMAKESPEC=C:\sim\dep\Qt\2010.02.1\Qt\mkspecs\win32-g++
    • set PATH=%path%;C:\sim\dep\Qt\2010.02.1\Qt\bin
    • set PATH=%path%;C:\sim\dep\Qt\2010.02.1\bin

    你可以使用批处理文件完成所有这些操作。我花了相当长的时间来解决这个问题,但自从那时以来,它为我节省了很多时间。这是一个脚本,用于自动将Qt安装更新到新位置。批处理文件可以在这里下载。


    2
    有一个简单的工具QtMove(http://www.runfastsoft.com)可以轻松实现这一点。
    运行移动后的qmake.exe构建您的.pro文件,然后应该将所有内容链接到新的Qt库。

    我认为仅修补 qmake.exe 是不够的。奇怪的是没有联系作者。 - Piotr Dobrogost
    链接目前已失效。原帖位于http://www.qtcentre.org/threads/45337-QtMove-Move-Qt-build-everywhere。 - the_mandrill

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接