Что за -MD -MMF опции для g++?
Всем привет! Обьясните пожалуйста, что это опции -MD -MMF в gcc, g++. Я часто их вижу в сгенерированных premake5, CMake Мейкфайлах. Но по ним практически никакой информации. Я нашел их обьяснение на gcc.gnu.org, но я не смог понять, что оно значит. Помогите, пожалуйста.
Ответы (2 шт):
Эти параметры нужны, чтобы заставить gcc генерировать специальные файлы зависимостей (*.d) для каждого объектника, которые потом можно включить в Makefile.
При ручном написании Makefile'ов, если пытаться указать зависимости в виде:
foo.o: foo.c
gcc -c foo.c -o foo.o
то возникает проблема, что foo.o не будет пересобран, если изменить один из хедеров, включённых в foo.c, напримeр foo.h. Можно указывать эти зависимости вручную:
foo.o: foo.c foo.h bar.h
gcc -c foo.c -o foo.o
но это довольно нудно.
Собственно одним из решений этой проблемы в и являются файлы зависимостей. Мы запускаем компилятор, чтобы он сгенерировал *.d-файл, а потом загружаем из него правила, чтобы явно не прописывать все хедеры:
foo.o: foo.c foo.d
gcc -c foo.c -o foo.o
foo.d: foo.c
gcc -M -MF foo.d foo.c
include foo.d
Сам файл зависимостей по факту является Makefile'ом и будет выглядеть примерно следующим образом:
foo.o: foo.h bar.h
В остальном, что именно делает каждый конкретный флаг из -M-флагов должно быть очевидно из их описания. Как всё это более практично применять в купе GNU Make/gcc можно посмотреть в этой статейке. А как именно это используют другие системы сборки — дело их внутреннего устройства.
PS: что такое -MMF я не знаю, но подозреваю, что подразумевалось -M -MF или -MMD.
В соседнем ответе объяснили, зачем эти флаги нужны, и показали пример, как ими пользоваться.
Но есть более простой способ. Вместо двух правил достаточно написать одно:
foo.o: foo.c
gcc foo.c -c -o foo.o -MMD -MP # Остальные флаги компилятора сюда же.
-include foo.d
Это объединяет компиляцию и генерацию .d-файла в один шаг, так что должно быть немного быстрее. И писать меньше.