GCC 预处理器输出和编译一次通过,v2
GCC preprocessor output and compilation in one pass, v2
正如这个问题所说,我需要一种方法来做
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 控制输出类型的选项; 因此,它不会尝试再次预处理源。
此解决方案还具有不生成程序集文件的优点,这 你不想要。
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- GCC 预处理器输出和编译一次通过,v2