GCC 预处理器一次输出和编译,v2

GCC preprocessor output and compilation in one pass, v2

作为this question says,我需要一个方法来做

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

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

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

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

On my compiler, from QNX but based on gcc 4.4.2, using -save-temps only gives me the assembly files (and no preprocessor files).

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

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

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

您想要的命令行:

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; 所以它不会尝试再次预处理源。

这个解决方案还有一个优点就是不生成汇编文件, 你不要。