18

什么设置适用于 GNU 在 Windows 上进行并行作业 (-j)?

我尝试使用 MinGW make 3.81 将 shell 设置为 cmd.exe,这适用于创建多个进程,但 make 失败并显示“等待作业”消息。

这可以工作吗?最好的设置是什么?(MinGW / Cygwin / ???)有人可以指出一个工作示例来测试吗?

4

5 回答 5

4

据我了解,GNU Make 的并行作业依赖于底层平台来提供(CPU)负载信息。不幸的是,这是以非 Windows 兼容的方式完成的,只有“make -j”命令可以按比例进行任何操作。该命令(没有最大作业数)可能非常危险,因为它会像饥饿的狗一样吃掉内存(我在 Qt 上尝试过,它在 Qt 中最大的项目 QtWebkit 上崩溃,4GB RAM,Win7)。

再想一想,我觉得 make -j3 比 make 运行得更快,但是根据我在网上可以找到的内容(论坛、手册...),它似乎是 POSIX/linux 特定的功能。

顺便说一句,我很惊讶你的问题被否决了。

于 2010-05-24T16:20:02.263 回答
4

可能对 CMake 用户有所帮助的提示

当 makefile 像 cmake-makefiles 通常那样递归调用 make 时,-jN 选项不起作用。但是有一个补救措施再次起作用,因为在生成的 makefile 中,CMake 通过这样的语法调用。

$(MAKE) -f CMakeFiles\Makefile2 <subproject>

这意味着您可以修改变量 MAKE:

mingw32-make "MAKE=mingw32-make -j3"

现在每次启动 subproject-make 时,它​​都会再次获得“-j3”选项。但请注意,这实际上并不像您预期​​的那样将并行编译的数量限制为 3。如果您在同一层次结构中有超过 3 个彼此不依赖的项目,则所有 3 个项目都将并行构建,并且每个项目都会启动 3 个编译步骤。产生 9 个并行编译步骤。

当我们再次仔细查看由 cmake 生成的顶级 Makefile 时,我们会看到目标“all”基本上只启动了一个子 make。

$(MAKE) -f CMakeFiles\Makefile2 all

所以我们可以通过调用去掉一层子项目并行

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all

但这牺牲了进度报告。

不过,我希望这会有所帮助。

于 2013-01-09T14:05:13.913 回答
3

我发现这个 Danny Thorpe 的博客文章解释了 Windows 上并行构建的问题。基本上它的建议是首先设置以下环境变量:

set SHELL=cmd.exe

这样,我就可以运行make -jstyle 命令,但不幸的是不能运行受控的make -jNstyle 命令。

于 2011-02-04T12:47:15.823 回答
3

我已经解决了这个问题,所以我将解决方案分享给大家。

您可以尝试 MinGW-TDM(主页:http ://tdm-gcc.tdragon.net/ )或 MinGW-Equation(下载页面: http: //www.equation.com/servlet/equation.cmd? fa=fortran )。

例如,安装 32 位版本D:\MinGW\MinGW32 (如果您希望使用 64 位编译二进制文件,则将 64 位版本安装到 D:\MinGW\MinGW64)

如下创建一个批处理文件,然后在您的构建目录中运行它:

Set MinGW_bin=D:\MinGW\MinGW32\bin
Set MSys_bin=D:\MinGW\msys\bin
Set Path=%MSys_bin%;%MinGW_bin%
mingw32-make SHELL=CMD.exe -j6 -f makefile

您可以从http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS下载 MSYS 。它有许多类似 UNIX 的实用程序,需要构建许多开源库、应用程序。

其中 -j6 是运行 6 个并行编译作业的选项。

提示:您可以设置选项 -jN,其中 N = CPU 内核(线程)数乘以 1.5。就我而言,我的 CPU 有 4 个线程,所以我将此值设置为 6。

注意:你可以运行

make.exe -jN -f 生成文件

没有 SHELL=CMD.exe选项,您的编译是并行运行的,但在某些情况下它不兼容(make.exe来自 MSYS 目录的位置)。

问候,

于 2012-08-05T03:17:15.173 回答
2

我从来没有make -jn在 Cygwin 下使用过任何问题。它工作得很好。我经常将它与微软的cl.exe编译器一起使用。它对我来说开箱即用。非常类似于 UNIX,这是一件好事™。构建脚本很好地移植到 Linux 和 Mac。彻底推荐。

自从我到了一个 5 个反斜杠太少,而 6 个又太多的地方,我就从来不喜欢 MinGW make。叹!(与MinGW hacks有关,使反斜杠分隔的路径名在make AFAIK中允许。)

于 2011-02-07T17:31:41.920 回答