是否可以使用GCC一步生成预处理器输出和编译?
类似的东西:
gcc -E -c main.cc -o main.o
会生成main.o和main.i
答案 0 :(得分:16)
是。
查看gcc
-save-temps
选项。
它编译源文件并将预处理的结果保存在.i
文件中。 (它还将汇编程序阶段的结果保存到.s
文件中。
gcc -save-temps -c main.cc -o main.o
将生成main.o
,还会生成main.i
和main.s
。
main.i
是预处理的结果。
答案 1 :(得分:6)
不,不是-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-临时工强>
永久存储通常的“临时”中间文件;将它们放在当前目录中,并根据源文件命名它们。
因此,使用-c -save-temps编译foo.c会生成文件foo.i和foo.s,以及foo.o。
这会创建一个预处理的foo.i输出文件,即使编译器现在通常使用集成的预处理器。