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.i
和main.s
.
main.i
是预处理的结果.
不,不是-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输出文件,即使编译器现在通常使用集成的预处理器.