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

时间:2017-05-19 22:58:28

标签: c++ gcc preprocessor

作为this question says,我需要一种方法

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

您希望的命令行:

foo.s

显示了给C编译器的C ++源文件。我认为这是一个漏洞。 你所得到的结果的配方是对称不同的 C和C ++。

对于你想要的C:

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

对于C ++,你想要:

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

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

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