让 qmake 与 32 位和 64 位并排安装一起工作

Posted

技术标签:

【中文标题】让 qmake 与 32 位和 64 位并排安装一起工作【英文标题】:Getting qmake to work with a 32bit and 64bit side by side installation 【发布时间】:2014-09-02 10:18:41 【问题描述】:

我想要在源代码控制下构建我们正在构建的 Qt 版本,并希望从同一源文件夹中并行构建 32 位和 64 位 Qt 以节省源代码控制空间。

设置库路径很简单,我的 qmake 文件中只有 QMAKE_LIBDIR_QT=$$PWD/Shared/Qt/$$QT_MAJOR_VERSION.$$QT_MINOR_VERSION.$$QT_PATCH_VERSION/lib/$$ARCHQMAKE_LIBDIR 的类似声明。

但是分割bin/ 文件夹并不容易。当从.../bin/x64 文件夹中使用 qmake 时,它​​会将 QT_HOST_BINQT_INSTALL_BINS 检测为 .../bin/,当我构建它时,它会尝试从该文件夹运行 uic 和其他工具并失败。

documentation 声明这些变量可以通过运行 qmake -set QT_HOST_BIN path 来设置,但这似乎是系统范围的设置,这是不可取的并且无论如何都不起作用,将它们设置为环境变量也不行。

在这一点上,我倾向于放弃并为 32 位和 64 位安装两个单独的 Qt。特别是因为我还没有开始研究如何处理plugins 文件夹。似乎 Qt 甚至没有开始考虑多架构构建设置。

【问题讨论】:

【参考方案1】:

不需要任何这种复杂性。您需要 3 或 5 个文件夹:

    工作副本中的 Qt 源文件夹。 32 位构建文件夹。 64 位构建文件夹。 32 位安装文件夹。 64 位安装文件夹。

如果您希望将二进制文件存储在源代码管理中,除了文件夹 1 之外,您只需要存储文件夹 4 和 5。

Qt 的源代码中没有任何文件的调整。在构建使用 Qt 的项目时,您必须使用文件夹 #2 或文件夹 #3 中的 qmake,具体取决于您选择的构建。您还可以通过这种方式为多个 Qt 版本构建,包括为 Qt 4 和 Qt 5 构建。

由于必须将二进制文件保存在源代码管理中实在是太疯狂了,因此您应该编写一个*** makefile 或批处理文件:

配置、构建和安装您需要的每个 Qt 构建。 运行相关的 qmake 为您的项目准备 makefile。 最后,构建项目。

然后,在结帐时,您只需运行一个脚本或 make 即可构建所有内容。您还应该从 Qt Creator 下载中捆绑 jom.exe,因为这将并行构建 nmake makefile。

我强调,任何 Qt 源代码都无需更改,您无需在项目文件中进行任何操作即可使用特定版本Qt的。一切都由您调用以设置项目的 Makefile 的 qmake 确定。

您也需要为您的应用程序使用影子构建文件夹。一般来说,不使用影子构建文件夹会适得其反。在小的源更改后为多个目标重建时,它们可以节省大量时间。当使用影子构建时,不要介意需要保持源文件夹的多个副本同步。这不值得。

【讨论】:

【参考方案2】:

我找到了指向qt.conf 的this answer。我发现bin/x64bin/x86 文件夹中有不同的qt.conf 文件,我可以将它们指向不同的文件夹,例如:

[Paths]
Prefix = ../..
Binaries = bin/x64
Plugins = plugins/x64

使用此设置,构建可以成功地使用单独的 bin/ 文件夹。

但是,我在阅读该答案时发现的另一个问题是所有 .prl 文件中都将包含 硬编码 路径。这意味着如果代码被检出到不同的目录,这可能不会构建。我将不得不在另一个问题中询问这个问题,看看是否有可能将 Qt 置于源代码控制之下。

编辑:目前看来,似乎可以通过编辑所有 .prl 文件以使用相对路径来解决此问题。我不确定为什么它们不是开始的相对路径,因为看起来你不应该弄乱目录结构。

【讨论】:

以上是关于让 qmake 与 32 位和 64 位并排安装一起工作的主要内容,如果未能解决你的问题,请参考以下文章

office32位和64位的区别,用户如何选择

navicat for mysql 64位和32位区别,win7 64位下用32位和64位有区别吗??

如何在同时拥有 64 位和 32 位版本的同时安装 64 位软件包?

当同时安装 32 位和 64 位 JVM 时,如何使用 32 位 JVM 强制运行 Jar 文件?

关于 64 位和 32 位 JVM

扫盲32位和64位Windows的区别