【发布时间】:2011-02-01 16:48:19
【问题描述】:
我们使用 Microsoft NMAKE 编译大量原生 C++ 和一些 Intel Fortran 文件。通常,makefile 包含这样的行(对于每个文件):
$(LINKPATH)\olemisc.obj : ole2\olemisc.cpp $(OLEMISC_DEP)
$(CCDEBUG) ole2\olemisc.cpp
$(GDEPS) ole2\olemisc.cpp
OLEMISC_DEP =\
e:\ole2\ifaceole.hpp\
e:\ole2\cpptypes.hpp\
等等
它工作正常,但一次编译一个文件。我们想利用多核处理器并一次编译多个文件。我将不胜感激有关实现这一目标的最佳方法的一些建议。这是我目前所拥有的。
一个: GNU make 允许您使用 --jobs=2 选项执行并行作业,例如,它适用于 GCC(遗憾的是,我们不能使用 GCC)。但微软的 NMAKE 似乎并不支持这样的选择。这两个名称程序的兼容性如何,如果我们确实开始使用 GNU MAKE,你能同时运行两个 cl.exe 进程吗?我希望他们抱怨 PDB(调试)文件被锁定,或者更新的 cl.exe 命令行参数之一是否可以解决这个问题?
二: cl.exe 有一个 /MP(多进程构建)标志,如果通过命令行一起传递,它可以让您同时编译多个文件,例如:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
但使用它需要更改生成文件。我们的 make 文件是由我们自己的程序从其他文件生成的,因此我可以轻松更改我们放入 makefile 中的内容。但是如何在 makefile 中将来自不同 cpp 文件的依赖项组合在一起,以便通过一个 cl.exe 调用将它们一起编译?每个 .obj 都是一个不同的目标,有一组命令来实现它?
或者我是否将 makefile 更改为不调用 cl.exe,而是我们编写的其他一些小可执行文件,然后将一系列 .cpp 文件收集在一起,然后向 cl.exe 传递多个参数?这会起作用并且似乎可行,但也似乎过于复杂,我看不到其他人这样做。
我是否遗漏了一些明显的东西?一定有更简单的方法来完成这个吗?
我们不使用 Visual Studio 或解决方案文件进行编译,因为文件列表很广泛,我们的 makefile 中有一些特殊项目,理论上不希望过度绑定到 MS C++ 等。
【问题讨论】:
标签: makefile compilation parallel-processing