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

Gcc 如何在cc 4.4.1中使用-MG标志?,gcc,compiler-construction,dependencies,ubuntu-9.10,Gcc,Compiler Construction,Dependencies,Ubuntu 9.10,我最近将Ubuntu安装从Jaunty升级到Karmic。这显然包括GNUC编译器的更新,因为以前编译过的代码不再更新 运行cc 4.4.1(Ubuntu 4.4.1-4ubuntu8)会在cc 4.3.3(Ubuntu 4.3.3-5ubuntu4)中运行良好的代码上产生以下错误: 添加-M或-MM标志会产生以下消息: [...] flex -o lex.c lex.l cc -c -MM -MG -MP -MF lex.d -g -Wall -O -o lex.o lex.c [...] c

我最近将Ubuntu安装从Jaunty升级到Karmic。这显然包括GNUC编译器的更新,因为以前编译过的代码不再更新

运行cc 4.4.1(Ubuntu 4.4.1-4ubuntu8)会在cc 4.3.3(Ubuntu 4.3.3-5ubuntu4)中运行良好的代码上产生以下错误:

添加
-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
文件。 到目前为止,我最好的解决方法是明确告诉
使
所有
.c
文件都依赖于所有
.h
文件,以确保所有内容都保持最新。 然而,这确实会在编译时导致许多不必要的工作


因此,我的问题是:我需要如何调整
cc
的标志以使其再次自动处理依赖项?

问题似乎在于-MMD开关。尝试将其更改为-MM,这将允许-MG开关工作。根据位于的GCC文档,-MMD与-MM相同,具有implicit-MF选项,并且由于您已经使用-MF指定了一个输出文件,您应该能够使用更简单的格式。

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

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

使用-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。它将在头文件之后生成,但如果头文件发生更改,则不会重新生成,除非明确指定。

欢迎使用超级用户!这个问题似乎与软件开发有关,因此可能会转移到堆栈溢出。只是为了确保:请不要在堆栈溢出上发布同样的问题,如果需要,它将自动移动。如果它已移动,请使用相同的OpenID登录并关联您的帐户,同时不要忘记阅读常见问题解答!成功。(也许我错了,你会在超级用户网站上看到很好的答案!)我把它放在这里是因为它与Jaunty到Karmic的升级有关,但转念一想你是对的。它可能更适合堆栈溢出:)欢迎使用超级用户!这个问题似乎与软件开发有关,因此可能会转移到堆栈溢出。只是为了确保:请不要在堆栈溢出上发布同样的问题,如果需要,它将自动移动。如果它已移动,请使用相同的OpenID登录并关联您的帐户,同时不要忘记阅读常见问题解答!成功。(也许我错了,你会在超级用户网站上看到很好的答案!)我把它放在这里是因为它与Jaunty到Karmic的升级有关,但转念一想你是对的。它可能更适合堆栈溢出:)谢谢你的建议。不幸的是,将-MMD标志替换为-MM会产生错误“无法识别文件:文件被截断”:(.我已经用错误的上下文更新了这个问题,也许这些信息会有所帮助?问题是在第一次编译中使用了-MM来生成依赖项…通常您会再次运行gcc来实际生成对象文件。使用-MM和-o是有问题的,因为您正在将依赖项信息写入.o文件并生成该文件nks它已更新。但是您在.o中获得的内容无效。感谢您的建议。不幸的是,将-MMD标志替换为-MM会产生错误“无法识别文件:文件被截断”:(.我已经用错误的上下文更新了这个问题,也许这些信息会有所帮助?问题是在第一次编译中使用了-MM来生成依赖项…通常您会再次运行gcc来实际生成对象文件。使用-MM和-o是有问题的,因为您正在将依赖项信息写入.o文件并生成该文件nks它已更新。但是你在.o中得到的是无效的。