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

问题描述 投票:0回答:2

我最近将我的 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
的标志才能使其再次自动处理依赖关系?

gcc dependencies ubuntu-9.10
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。它将在标头之后构建,但如果标头发生更改,除非明确指定,否则它不会被重建。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.