如何利用所有核心进行 nmake 编译?

61

我刚换了一台新的四核电脑,发现nmake只使用了一个进程。

我曾经使用过make,它有一个开关“-j4”可以启动4个进程。那么nmake的同等选项是什么?

[编辑]

根据下面的信息,我已经能够在我的qmake项目文件中添加一个命令:

QMAKE_CXXFLAGS += /MP

这对于我来说非常有效。非常感谢。

8个回答

57

另一种非 Qt 相关的通用方法是设置环境变量 CL/MP,以告诉 nmake 使用所有核心:

set CL=/MP
nmake

将使用所有的CPU核心。


3
只有当使用相同命令编译多个文件时,这才有帮助。 - Zitrax
@Zitrax:你说得对。通常,你需要编译一个项目(一堆文件)使其正常工作。 - Violet Giraffe
7
我看过的这个项目需要编译几百个文件,但每个文件都使用单独的cl命令,例如 cl a.cpp, cl b.cpp, cl c.cpp, ...。因此我想指出,除非将构建系统重写为向每个cl命令提供多个文件,例如 cl a.cpp b.cpp c.cpp ...,否则在使用nmake时似乎没有帮助。 - Zitrax
@Zitrax:也许https://learn.microsoft.com/en-us/cpp/build/batch-mode-rules?view=vs-2017是相关的?我自己没有尝试过。 - Joseph Quinsey
那个误导性的提示使用 set CL=/MP 应该更清楚地被驳回。 这导致了很多不必要的额外工作。 - dvo
2
@dvo:对我来说,“误导性提示”在许多不同的项目中都非常有效,特别是那些我只想构建并完成而不修改提供的项目文件的项目。如果您发现了问题,详细说明问题以警告他人比仅仅抱怨“某些东西没用”更有用。 - Violet Giraffe

40

7
预编译的 Jom 二进制文件在这里:ftp://ftp.qt.nokia.com/jom/。 - Lucas
链接已失效,这是一个 nmake 问题,而不是 QT 问题。也许您可以更详细地解释一下。 - jww
1
@jww 这个链接至少在9年前是有效的(并且最近的评论中有更新)。你看到问题中的“qt”和“QMAKE_CXXFLAGS”标签了吗?另外,9年前的nmake不支持使用多核心...所以没有理由对这个答案进行负评。 - Tolik Odukha
2
@jww:jom是一个可替换nmake的工具,它不依赖于Qt。 - Jean-Michaël Celerier
@Jean-MichaëlCelerier 我原以为...虽然jom适用于由QMake生成的NMake文件,但它不适用于由CMake生成的NMake文件;它会抱怨一个无效的NMake格式文件。所以在这种情况下,它不是一个即插即用的替代品。编辑:当使用CMake生成器“NMake Makefiles JOM”时,它可以工作。 - jmk
如果您正在使用CMake,建议使用Ninja生成器而不是nmake或jom,特别是对于增量重建,它会更快。@jmk - Jean-Michaël Celerier

27
根据MSDN的说法,nmake没有这样的选项。
不过你可以通过在VC++命令行编译器中使用/MP选项并同时传递多个文件来让编译器并行构建多个文件。
> cl /MP a.cpp b.cpp c.cpp

然而请注意,大多数Makefile并不会像这样调用编译器 - 它们通常为每个单独的源文件单独调用编译器,这将阻止/MP选项发挥任何有用的作用。


1
只有 .obj 而不是 .o。VC++ 编译器生成 .obj,GCC 生成 .o,据我所知。 - abatishchev
16
使用这个标志的一种方便的方法是让cl.exe从"CL"环境变量中检索它。在你的系统属性中设置它或者在命令行上输入:"set CL=/MP"。 - jturcotte

6

截至撰写本文时,CMake 2.8.1 RC1已经准备好尝试,为NMake带来了一个名为NMake Makefiles JOM的新生成器,并使用特定设置为jom生成NMake,jom是NMake的替代品。因此,它使用NMake实现了多进程构建。


6

Incredibuild声称能够在多核/多台机器上运行nmake构建。我没有任何使用经验。


其实很简单,而且效果非常好。这是一个不错的参考链接:http://xoreax.helpserve.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=171 - ttvd
是的!我曾经开发过一个应用程序,完整编译需要大约1小时20分钟。使用Incredibuild和大约10台多处理器机器,同样的应用程序只需5分钟即可编译完成。如果你问我,这是相当令人印象深刻的改进! - Alexis Wilke
如欲了解如何使用IncrediBuild加速nMake的参考链接已更改为link。免责声明 - 本评论作者就职于IncrediBuild公司。 - Dori
@Dori - 这个链接需要登录才能访问。你能提供一个不需要购买产品或加入公司或其任何计划的链接吗? - jww
@jww非常抱歉,但您需要注册才能获得IncrediBuild的版本(为了接收产品链接而注册是一种惯例...)。注册后,您将获得该产品的30天试用许可证,该许可证将允许您在网络中分配编译任务到额外的核心上(从而增加参与构建的核心数量,最多可达每台8个核心的5台机器)。试用期结束后,您仍然可以免费在本地计算机上使用IncrediBuild :) 免责声明-作者在IncrediBuild工作。 - Dori

2

4
这是指在同一次编译器调用中并行编译多个 .cpp 文件,而不是并行构建多个“make”目标。 - Alnitak
这很有趣,如何在VS2008中打开这个开关!我找不到它。 - abatishchev
这不是“nmake”选项,而是“c1”选项(即用于命令行编译器)。 - Alnitak
是的,cl.exe,所以它应该可以在Visual Studio中使用,只要直接调用它,我猜,不使用nmake。或者我错了? - abatishchev
Visual Studio 默认使用了那个开关吗?我记得它已经批量编译文件了。 - MSalters
是的,IDE默认会使用它,它只是启动了两个cl实例 - 但你不能在nmake中使用它。 - Martin Beckett

2

对于普通的makefile来说,这种方法不适用,但是在Visual Studio 2005中有一个设置可以让你同时构建多个.vcproj文件(前提是它们之间没有依赖关系)。打开“工具”->“选项”->“项目和解决方案”->“生成和运行”->“X 最大并行项目构建数”。


-1

虽然不完全相同,但如果您使用cmake,则可以导出解决方案(例如使用生成器“Visual Studio 14 2015”而不是“NMake Makefiles”)。

在这种情况下,可以使用msbuild工具构建导出的解决方案,该工具允许您使用/maxcpucount命令行开关并行化构建过程。


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