【发布时间】:2012-02-20 22:04:11
【问题描述】:
是否可以使用 GCC 一步生成预处理器输出和编译?
类似:
gcc -E -c main.cc -o main.o
这将生成 main.o 和 main.i
【问题讨论】:
标签: gcc c-preprocessor
是否可以使用 GCC 一步生成预处理器输出和编译?
类似:
gcc -E -c main.cc -o main.o
这将生成 main.o 和 main.i
【问题讨论】:
标签: gcc c-preprocessor
不,不是 -E 本身,-s、-c 和 -E 选项称为“停止”选项。他们实际上会在特定点停止该过程,因此您无法继续进行。
如果您想这样做,您必须分两次执行,或者使用-save-temps 保留在编译期间通常删除的临时文件的副本。
来自gcc 联机帮助页,讨论-E 的内容(稍作解释):
如果您只想要编译的某些阶段,您可以使用 -x(或文件名后缀)告诉 gcc 从哪里开始,并使用选项 -c、-S 或 -E 之一来说明 gcc 在哪里停止。请注意,某些组合(例如,-x cpp-output -E)会指示 gcc 什么都不做。
-E 表示:预处理阶段结束后停止;不要正确运行编译器。输出为预处理源代码的形式,发送到标准输出(如果指定了-o,则发送到输出文件)。
如果使用 -E 选项,除了预处理之外什么都不做。
还有-save-temps的描述:
-save-temps
永久存储通常的“临时”中间文件;将它们放在当前目录下,并根据源文件命名。
因此,使用 -c -save-temps 编译 foo.c 会生成文件 foo.i 和 foo.s,以及 foo.o。
即使编译器现在通常使用集成的预处理器,这也会创建一个预处理的 foo.i 输出文件。
【讨论】:
是的。
看gcc-save-temps选项。
它编译源文件并将预处理结果保存在.i 文件中。 (它还将汇编阶段的结果保存到.s 文件中)。
gcc -save-temps -c main.cc -o main.o
将生成main.o,但也会生成main.i 和main.s。
main.i 是预处理的结果。
【讨论】:
.s 文件