作为this question says,我需要一种方法
gcc -E -c main.cc -o main.o
在我的编译器上,从QNX但基于gcc 4.4.2
,使用-save-temps
只给我汇编文件(并没有预处理器文件)。
如果我在上面的命令中添加-E
,则预处理器输出将保存到main.o
。
我需要一个解决方案,在gcc
的一次调用中使用上述约束进行编译和输出预处理器。
答案 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;
所以它不会再尝试预处理源。
此解决方案还具有不生成程序集文件的优点 你不想要。