如何在 QT Creator 中使用 mingw 在多核上编译

Posted

技术标签:

【中文标题】如何在 QT Creator 中使用 mingw 在多核上编译【英文标题】:How to compile on multiple cores using mingw inside QTCreator 【发布时间】:2012-03-14 07:36:55 【问题描述】:

我的 Windows 桌面上有一个四核 i7 CPU。我试图让 mingw32-make 使用尽可能多的核心进行编译。我已将 -j8 添加到 Build Settings->Build Steps 下的“Make Arguments”字段中。 mingw32-make 似乎完全忽略了该选项,因为我没有从中获得任何速度改进。当我在任务管理器中查看 CPU 使用率时,它保持在 13%,我只看到一个 g++ 实例正在运行。

目前,使用 mingw 重建整个项目需要 3 分钟。使用 MSVC 重建它只需 15 秒。

为了您的信息,我在项目设置中启用了预编译头选项。这也让 VC 的事情变得更快。但是我仍然没有看到使用 mingw 预编译头文件的好处。

如果您曾经让 mingw 从 QTCreator 并行编译多个源文件,请分享您的 cmets。谢谢!

【问题讨论】:

【参考方案1】:

这就是我所做的。

在 Qt Creator 的工具 -> 选项菜单中,在“构建和运行”部分下,有一个选项显示“使用 jom 而不是 nmake”。我检查了那个框,但没有任何改变。所以相反,我去了项目的构建设置,在构建步骤类别下有一个“制作”项目。展开详细信息,您会发现“Override mingw32-make.exe:”项。我在里面粘贴了“C:\QtSDK\QtCreator\bin\jom.exe”,突然间我开始用多核构建了。

在 Qt Creator 2.4.1 上为我工作。试试看吧。

【讨论】:

使用 JOM 代替 mingw32-make 效果很好!虽然还是比VC编译慢很多,但比以前快很多。 这是因为微软的编译器想一次调用吃掉许多 c++ 文件。像 make 这样的传统 1970 技术不支持这一点,它们每次调用一个文件来调用编译器,这对预编译头文件不利,如您所见。切换到更好的构建系统。【参考方案2】:

-j8 可能无法正常工作,因为 GNU Make 在 Win32 上的限制。

尝试将 -j 放入 make 参数字段。这告诉 Make 产生尽可能多的编译进程——如果你有足够的 RAM 和 CPU 来处理它,它应该比单个编译更快。

不幸的是,只有这两个选项(无需修改 Makefile):-j1,或无限制-j

详细信息:Win32 上的 GNU Make 不支持作业服务器,因此父 Make 进程无法跟踪任何子 Make 生成的编译进程的数量。为安全起见,子 Make 仅使用 -j1 运行。我相信 qmake/Qt Creator 生成的 Makefile 使用了多层 Makefile。我首先通过 Microchip 的 MPLAB X IDE 发现了这个问题,查看this thread 了解更多信息

此引用来自 README.W32 随 GNU Make 分发

支持并行构建

此端口支持并行构建 (-jN),有 2 个 限制:

并发进程数硬限制为 64, 由于这个端口实现等待它的方式 子流程;

作业服务器方法(当 Make 在 Posix 上运行时可用 平台)不受支持,这意味着您必须通过 显式 -jN 切换到递归 Makefile 中的子 Make。 如果子 Make 没有收到显式的 -jN 开关,它 将默认为 -j1,即 sub-Make 中没有并行性。

【讨论】:

使用 -j 效果很好,尽管它会在我的计算机上生成大量编译进程。感谢您的意见! 这是一个很好的权宜之计,除非您正在构建一个大型项目。如果您要编译十几个源,您肯定会遇到主要的 CPU 问题。如果您要编译超过三到四打源,您几乎肯定会遇到内存问题。【参考方案3】:

-j9 (将9 替换为NUMBER_OF_PROCESSORS(Windows)/$(nproc)(Linux) 的值加一——这是最佳的)到所有

QString makefilein = " -f " + subtarget->makefile;

qmake\generators\makefile.cpp 中的行(自行查找)。

结果是

QString makefilein = " -j9 -f " + subtarget->makefile;

然后使用适当的参数运行configure.exe(!以及额外的-qmake -dont-process 以避免生成大量的makefile!)。

问题是您在“调试和发布”构建期间获得了两组进程。因此,产生的进程总数为 18+。

【讨论】:

【参考方案4】:

使用MAKE_COMMAND环境变量:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%

【讨论】:

没有。这不适用于 mingw32-make。选项 -jN 被简单地忽略。 不知道该告诉你什么,但它适用于我和其他人:***.com/questions/1247162/…【参考方案5】:

在 Qt Creator 中,转到 Projects -> Build & Run -> your specific MinGW build setup -> Build Environment(这是在 General / Build steps / Clean steps 下方的屏幕上..),然后添加一个变量 MAKEFLAGS并将其设置为-j8。我用-j4 和QtCreator 4.4.1 和MinGW 5.3.0 在我的两台核心机器上测试了这个。在编译我的处理器时,可以在任务管理器中看到 100% 的性能。如果没有这个选项,它大约是 25%,所以我认为它完全按预期工作。现在构建速度要快得多。

【讨论】:

【参考方案6】:

-j 是要走的路,不幸的是,对我来说,这个项目太大了,它耗尽了我所有的可用内存并且我的电脑死机了,所以要注意这一点。 Brendan 说,例如,没有办法只使用一半的核心,如果属实,那真是太可惜了。

【讨论】:

【参考方案7】:

问题是原始品牌没有作业服务器支持。所以mingw32端口也没有。然而,它已经被添加了。我相信具有“正确”作业服务器支持的最旧版本是 3.82.90。您可以在下面的链接中找到它。

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/

【讨论】:

以上是关于如何在 QT Creator 中使用 mingw 在多核上编译的主要内容,如果未能解决你的问题,请参考以下文章

使用MinGW编译Qt Creator

如何在 Qt creator 中更改/配置所需的编译器?即在 MSVC/Mingw 或 g++/clang++ 之间切换

如何向 Qt Creator 添加新工具包

Webview 在 Windows 上的 mingw 中无法在 Qt Creator 中工作

qt creator 怎么配置mingw

使用 Qt Creator / qmake / MinGw 的预编译标头无法在调试版本中工作