Мы используем Microsoft NMAKE для компиляции большого количества собственных C ++ и некоторых файлов Intel Fortran.Обычно make-файлы содержат такие строки (для каждого файла):
$ (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 \
и т. Д.
Работает нормально, но компилирует по одному файлу за раз.Мы хотели бы использовать преимущества многоядерных процессоров и компилировать более одного файла одновременно.Буду признателен за советы о том, как это сделать, пожалуйста.Вот что у меня есть.
One: GNU make позволяет вам выполнять параллельные задания, например, с опцией --jobs = 2, и это прекрасно работает с GCC (мы не можем использовать GCCк сожалению).Но NMAKE от Microsoft, похоже, не поддерживает такую возможность.Насколько совместимы эти две программы имен, и если бы мы начали использовать GNU MAKE, могли бы вы запустить два процесса cl.exe одновременно?Я ожидаю, что они будут жаловаться на блокировку файла PDB (отладки), или один из новых аргументов командной строки cl.exe поможет вам с этим?
Two: cl.exeимеет флаг / MP (сборка с несколькими процессами), который позволяет компилировать несколько файлов одновременно, если они передаются вместе через командную строку, например:
cl / MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
Но использование этого потребует внесения изменений в make-файл.Наши make-файлы генерируются нашей собственной программой из других файлов, поэтому я могу легко изменить то, что мы помещаем в make-файлы.Но как объединить зависимости из разных файлов cpp вместе в make-файле, чтобы они были скомпилированы вместе с помощью одного вызова cl.exe?Каждый .obj - это отдельная цель с набором команд для ее создания?
Или я могу изменить make-файл так, чтобы он не вызывал cl.exe, а скорее какой-то другой маленький исполняемый файл, который мы пишем, который затем собирает последовательностьфайлов .cpp вместе и оболочки в cl.exe, передавая несколько аргументов?Это будет работать и кажется выполнимым, но также кажется слишком сложным, и я не вижу, чтобы кто-то еще делал это.
Я что-то упускаю из виду?Должен быть более простой способ сделать это?
Мы не используем Visual Studio или файл решения для компиляции, потому что список файлов обширный, у нас есть несколько специальных элементов в наших make-файлах, итеоретически не хочу быть чрезмерно привязанным к MS C ++ и т. д.