如何在cc 4.4.1中使用-MG标志?

时间:2009-11-18 16:57:56

标签: gcc compiler-construction dependencies ubuntu-9.10

我最近将我的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 个答案:

答案 0 :(得分:2)

-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,但实际上并不一定取决于生成的文件。即。它将在标题之后构建,但如果标题发生更改,则不会重建它,除非明确指定。

答案 1 :(得分:0)

-MMD开关似乎是问题所在。尝试将其更改为-MM,这应该允许-MG开关工作。根据{{​​3}}处的GCC文档,-MMD与带有impllicit -MF选项的-MM相同,并且由于您已经使用-MF指定了输出文件,因此您应该能够使用更简单的形式。