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

时间:2012-02-10 15:27:21

标签: c++ linker g++ c-preprocessor vxworks

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

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

以及所有包含路径。现在,当我编译这个预处理文件时,生成的对象文件比直接编译原始文件要小得多(约30%)。然后当我链接程序时,链接器会抱怨缺少符号(全部在用户代码中),这在使用原始源文件时也不会发生。为什么会有区别?有没有办法让这项工作?

2 个答案:

答案 0 :(得分:1)

您确定您没有错过命令行中的任何-D定义吗?由于条件限制,您的结果与未编译的部分一致。

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

答案 1 :(得分:1)

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

我能想到的唯一区别是宏会导致扩展为已经扩展的宏名称的标识符 - 预处理器会在此时停止扩展,但如果再次运行预处理器,则会扩展标识符再次。我原以为这可能会导致编译错误,但谁知道呢?