【问题标题】:GCC preprocessor output and compilation in one pass, v2GCC 预处理器输出和编译一次通过,v2
【发布时间】:2017-10-20 04:13:46
【问题描述】:

作为this question says,我需要一个办法

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

在我的编译器上,来自 QNX,但基于 gcc 4.4.2,使用 -save-temps 只会给我汇编文件(而不是预处理器文件)。

如果我像上面的命令一样添加-E,预处理器输出将保存到main.o

我需要一种解决方案,在一次调用 gcc 时,在具有上述约束的情况下进行编译和输出预处理器。

【问题讨论】:

  • XY 问题。分两步有什么问题?
  • @Olaf 花费了两倍的时间。预处理器在编译期间已经被调用,为什么这不可能呢?
  • 那不一样。在现代编译器上,预处理和编译不一定有两个不同的通道。如果有两个阶段,您很可能不会失去太多性能。但是,如果您在加速编译之后,请使用构建工具;这将比您似乎担心的节省更多的时间。
  • 根据this site 关于-E 选项:(...) and one of the options -c, -S, or -E to say where gcc is to stop - “停止”不会留下太多希望一步到位。
  • @Barmar:当被问到时,它会生成一个特殊的帮助。当它正常继续时,它永远不会生成文本表单。它同时通过预处理和 C/C++ 解析将文件解析为内存中的语法树。

标签: c++ gcc preprocessor


【解决方案1】:

在我的编译器上,来自 QNX,但基于 gcc 4.4.2,使用 -save-temps 只会给我汇编文件(而不是预处理器文件)。

对于这么旧版本的 GCC 或任何 QNX 变体,我无法验证这一点。当然 所有主线 GCC 版本至少与 4.7 一样老尊重... -c -save-temps foo.c 通过将预处理的源代码保存在foo.i 中并将程序集保存在foo.s 中。

但如果您的 QNX GCC 4.4.2 出现这种情况,则有一种解决方法。

从您的 cmets 看来,您反对调用 编译器两次是你不想浪费时间 对源进行两次预处理。但是你可以调用编译器两次,一次进行预处理, 再次进行编译,所以我认为这将是一个令人满意的解决方案。

你想要的命令行:

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

显示了一个 C++ 源文件被提供给 C 编译器。我认为这是一个失误。 你所追求的结果的配方是对称不同的 C 和 C++。

对于你想要的 C:

gcc -E main.c > main.i && gcc -c -o main.o main.i

对于你想要的 C++:

g++ -E main.cc > main.ii && g++ -c -o main.o main.ii

这将写入要保存到的预处理 C[C++] 输出 main.i[.ii] 然后将该预处理输出传递给编译器 再次用于 C[C++] 编译。 gcc[g++] 识别文件 扩展名.i[.ii] 表示不应预处理的C[C++] 源代码。 见3.2 Options Controlling the Kind of Output; 因此它不会再次尝试对源进行预处理。

此解决方案还有一个优点是不生成程序集文件,这 你不想要。

【讨论】:

    猜你喜欢
    • 2012-02-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
    相关资源
    最近更新 更多