GCC预处理器输出和编译一次通过

时间:2012-01-27 23:21:41

标签: gcc c-preprocessor

是否可以使用GCC一步生成预处理器输出和编译?

类似的东西:

gcc -E -c main.cc -o main.o

会生成main.o和main.i

2 个答案:

答案 0 :(得分:16)

是。

查看gcc -save-temps选项。

它编译源文件并将预处理的结果保存在.i文件中。 (它还将汇编程序阶段的结果保存到.s文件中。

gcc -save-temps -c main.cc -o main.o

将生成main.o,还会生成main.imain.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输出文件,即使编译器现在通常使用集成的预处理器。