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

ale*_*sko 12 gcc c-preprocessor

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

就像是:

gcc -E -c main.cc -o main.o
Run Code Online (Sandbox Code Playgroud)

这将生成main.o和main.i

oua*_*uah 18

是.

看看gcc -save-temps选项.

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

gcc -save-temps -c main.cc -o main.o
Run Code Online (Sandbox Code Playgroud)

会产生main.o但也main.imain.s.

main.i 是预处理的结果.


pax*_*blo 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:

- 保存 - 临时工

永久存储通常的"临时"中间文件; 将它们放在当前目录中,并根据源文件命名它们.

因此,使用-c -save-temps编译foo.c会生成文件foo.i和foo.s,以及foo.o.

这会创建一个预处理的foo.i输出文件,即使编译器现在通常使用集成的预处理器.