Цель ключа -MG - позволить генератору автозависимостей работать правильно, даже если еще не созданы фактические заголовочные файлы. Однако, когда вы на самом деле пытаетесь скомпилировать код, важно, чтобы заголовки существовали; чтобы их можно было скомпилировать.
По этой причине -MG может использоваться только в сочетании с -MM или -M, оба из которых подразумевают флаг -E, что означает, что они фактически не компилируют код.
Так что, если вы хотите использовать -MG, вам придется использовать отдельные команды для генерации зависимостей и компиляции. Например
cc -MM -MG -MP -MF lex.d lex.c
cc -c -g -Wall -O -o lex.o lex.c
Или напишите файл make таким образом, чтобы заголовки генерировались первыми. например,
GENERATED=(list of headers that get created during the build process)
lex.o: lex.c | $(GENERATED)
cc -c -MMD -MP -MF lex.d -g -Wall -O -o lex.o lex.c
##...
## individual build rules for generated headers.
Обратите внимание, что '|' означает, что lex.o должен быть создан после сгенерированных файлов, но это не обязательно зависит от сгенерированных файлов. то есть. он будет построен после заголовков, но не будет перестроен, если заголовки изменятся, если явно не указано.