编译先前预处理的文件会更改输出

Compiling previously preprocessed file changes output

本文关键字:输出 文件 预处理 编译      更新时间:2023-10-16

我有一个源文件,我使用选项-E-P对其进行预处理(对于基于vxWorks的嵌入式平台,使用GCC 4.1.2)。所有其他选项都与编译文件时相同。这些选项是:

-Wall  
-march=pentium 
-nostdinc 
-O0 
-fno-builtin 
-fno-defer-pop
-g  
-c
-o

以及所有包含路径。现在,当我编译这个经过预处理的文件时,得到的对象文件比我直接编译原始文件时要小得多(大约30%)。当我链接程序时,链接器会抱怨缺少符号(都在用户代码中),而在使用原始源文件时,这种情况不会再次发生。为什么会有区别?有什么办法让它发挥作用吗?

您确定没有在命令行中丢失任何-D定义吗?您的结果将与由于条件语句而未编译的部分一致。

另一种可能性(因为您没有具体命名编译器)是,您在vxWorks环境中使用的是通用gcc -E,而不是arch特定的交叉编译器。交叉gcc将预定义gcc -E所需的一些变量。

编译经过预处理的输出时,请尝试传递-fpreprocessed选项,告诉GCC不要再进行预处理。

我能想到的唯一区别是,宏会扩展到一个标识符,这个标识符是一个已经扩展的宏名称——预处理器在这一点上停止扩展,但如果你再次运行预处理器,标识符会再次扩展。我本以为这种情况会导致编译器错误,但谁知道呢?