【问题标题】:GCC preprocessor output and compilation in one passGCC 预处理器输出和编译一次通过
【发布时间】:2012-02-20 22:04:11
【问题描述】:

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

类似:

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

这将生成 main.o 和 main.i

【问题讨论】:

    标签: gcc c-preprocessor


    【解决方案1】:

    不,不是 -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 输出文件。

    【讨论】:

    • 感谢您提供详细信息!
    【解决方案2】:

    是的。

    gcc-save-temps选项。

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

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

    将生成main.o,但也会生成main.imain.s

    main.i 是预处理的结果。

    【讨论】:

    • 我的基于 gcc 的编译器只保存 .s 文件
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2011-08-23
    相关资源
    最近更新 更多