C++ GCC预处理器一次输出和编译,v2
就像,我需要一个方法去做C++ GCC预处理器一次输出和编译,v2,c++,gcc,preprocessor,C++,Gcc,Preprocessor,就像,我需要一个方法去做 gcc-E-c main.cc-o main.o 在我的编译器上,来自QNX,但基于gcc 4.4.2,使用-save temps只提供程序集文件(而不提供预处理器文件) 如果我像上面的命令一样添加-E,预处理器输出将保存到main.o 我需要一个解决方案,该解决方案在一次调用gcc时使用上述约束进行编译并输出预处理器 在我的编译器上,来自QNX,但基于GCC4.4.2,使用-save temps只提供程序集文件(没有预处理器文件) 对于这样一个旧版本的GCC或任何QN
gcc-E-c main.cc-o main.o
在我的编译器上,来自QNX,但基于gcc 4.4.2
,使用-save temps
只提供程序集文件(而不提供预处理器文件)
如果我像上面的命令一样添加-E
,预处理器输出将保存到main.o
我需要一个解决方案,该解决方案在一次调用gcc
时使用上述约束进行编译并输出预处理器
在我的编译器上,来自QNX,但基于GCC4.4.2,使用-save temps只提供程序集文件(没有预处理器文件)
对于这样一个旧版本的GCC或任何QNX变体,我无法验证这一点。当然
所有的主线GCC版本至少与4.7版本相同,都符合-c-保存临时文件foo.c
将预处理的源代码保存在foo.i
中,将程序集保存在foo.s
中
但是如果您的QNX GCC 4.4.2就是这种情况,那么有一个解决方法
从您的评论来看,您似乎反对调用
编译器的两个特点是,您不希望在这方面浪费时间
对源代码进行两次预处理。但是你可以调用编译器两次,一次只做预处理,
再次强调,只进行编译,因此我认为这将是一个令人满意的解决方案
您希望的命令行:
gcc -E -c main.cc -o main.o
显示C++编译器的C++源文件。我想这是个失误。 你所追求的结果的配方对你来说是完全不同的 C和C++的< < /P> 对于您想要的C:
gcc -E main.c > main.i && gcc -c -o main.o main.i
g++ -E main.cc > main.ii && g++ -c -o main.o main.ii
< C++ >你想要:
gcc -E main.c > main.i && gcc -c -o main.o main.i
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++]源代码。
看见
因此,它不会再次尝试预处理源代码
此解决方案还具有不生成程序集文件的优点,因为
您不需要。XY问题。使用两个步骤有什么问题?@Olaf需要两倍的时间。编译过程中已经调用了预处理器,那么为什么不可能呢?这不一样。在现代编译器上,预处理和编译不一定有两个截然不同的过程。如果有两个阶段,您很可能不会损失太多性能。但是,如果您正在加速编译,请使用构建工具;它将比您似乎担心的节省更多的时间。根据关于
-E
选项:(…)和选项之一-c、-S或-E来说明gcc停止的位置-“停止”在一步中并没有留下太多希望。@Barmar:当被要求时,它会作为一种特殊的帮助生成该选项。当它正常运行时,它永远不会生成文本形式。它同时从预处理和C/C++解析将文件解析为内存中的语法树。