Что за -MD -MMF опции для g++?

Всем привет! Обьясните пожалуйста, что это опции -MD -MMF в gcc, g++. Я часто их вижу в сгенерированных premake5, CMake Мейкфайлах. Но по ним практически никакой информации. Я нашел их обьяснение на gcc.gnu.org, но я не смог понять, что оно значит. Помогите, пожалуйста.


Ответы (2 шт):

Автор решения: Fat-Zer

Эти параметры нужны, чтобы заставить 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.

→ Ссылка
Автор решения: HolyBlackCat

В соседнем ответе объяснили, зачем эти флаги нужны, и показали пример, как ими пользоваться.

Но есть более простой способ. Вместо двух правил достаточно написать одно:

foo.o: foo.c
    gcc foo.c -c -o foo.o -MMD -MP # Остальные флаги компилятора сюда же.

-include foo.d

Это объединяет компиляцию и генерацию .d-файла в один шаг, так что должно быть немного быстрее. И писать меньше.

→ Ссылка