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

GCC preprocessor output and compilation in one pass, v2

本文关键字:一次 v2 处理器 预处理 输出 编译 GCC      更新时间:2023-10-16

正如这个问题所说,我需要一种方法来做

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

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

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

我需要一个解决方案,该解决方案在具有上述约束的一次gcc调用中同时进行编译并输出预处理器。

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

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

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

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

您想要的命令行:

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 控制输出类型的选项; 因此,它不会尝试再次预处理源。

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