Как использовать флаг -MG в cc 4.4.1? - PullRequest
0 голосов
/ 18 ноября 2009

Я недавно обновил установку Ubuntu с Jaunty до Karmic. Это, очевидно, включает в себя обновление компилятора GNU C, потому что код, скомпилированный ранее, больше не делает.

Запуск cc 4.4.1 (Ubuntu 4.4.1-4ubuntu8) теперь выдает следующую ошибку в коде, который отлично работал в cc 4.3.3 (Ubuntu 4.3.3-5ubuntu4):

$ make
cc -c -MMD -MG -MP -MF lex.d -g -Wall -O -o lex.o lex.c
cc1: error: -MG may only be used with -M or -MM

Добавление флага -M или -MM привело к следующему сообщению:

[...]
flex -o lex.c lex.l
cc -c -MM -MG -MP -MF lex.d -g -Wall -O -o lex.o lex.c
[...]
cc -g -Wall -O -o translate lex.o grammar.tab.o main.o list.o salloc.o suffixed.o expr.o emit.o optimize.o -lfl
lex.o: file not recognized: File truncated
collect2: ld returned 1 exit status
make: *** [translate] Error 1

Мне сказали, что различные -Mx сообщают флаги make, как различные файлы c зависят от .h файлов. Мое лучшее решение на данный момент - явно указать make, что все файлы .c зависят от всех файлов .h, чтобы убедиться, что все обновляется. Однако это вызывает много ненужной работы во время компиляции.

Поэтому мой вопрос: как мне настроить флаги для cc, чтобы он снова автоматически обрабатывал зависимости?

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

Цель ключа -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 должен быть создан после сгенерированных файлов, но это не обязательно зависит от сгенерированных файлов. то есть. он будет построен после заголовков, но не будет перестроен, если заголовки изменятся, если явно не указано.

0 голосов
/ 20 ноября 2009

По-видимому, проблема с переключателем -MMD. Попробуйте изменить это на -MM, что должно позволить переключателю -MG работать. Согласно документации GCC на http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Preprocessor-Options.html, -MMD - это то же самое, что и -MM с опцией impllicit -MF, и, поскольку у вас есть выходной файл, уже указанный с -MF, вы можете использовать более простой форма.

...