如何在 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 在多核上编译的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt creator 中更改/配置所需的编译器?即在 MSVC/Mingw 或 g++/clang++ 之间切换