0

我最近将我的 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

添加-Mor-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才能让它再次自动处理依赖关系?

4

2 回答 2

3

-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 必须在生成的文件之后构建,但它不一定实际上依赖于生成的文件。IE。它将在标头之后构建,但如果标头更改,除非明确指定,否则不会重新构建。

于 2011-05-30T13:34:04.773 回答
0

-MMD 开关似乎是问题所在。尝试将其更改为 -MM 这应该允许 -MG 开关工作。根据http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Preprocessor-Options.html上的 GCC 文档,-MMD 与带有隐式 -MF 选项的 -MM 相同,因为您'已经用 -MF 指定了一个输出文件,你应该能够使用更简单的形式。

于 2009-11-20T14:16:22.557 回答