我最近将我的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
的标志以使其再次自动处理依赖项?
答案 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指定了输出文件,因此您应该能够使用更简单的形式。