我有一个源文件,我使用选项-E
和-P
预处理(使用GCC 4.1.2作为基于vxWorks的嵌入式平台)。所有其他选项与编译文件时相同。这些选项是:
-Wall
-march=pentium
-nostdinc
-O0
-fno-builtin
-fno-defer-pop
-g
-c
-o
以及所有包含路径。现在,当我编译这个预处理文件时,生成的对象文件比直接编译原始文件要小得多(约30%)。然后当我链接程序时,链接器会抱怨缺少符号(全部在用户代码中),这在使用原始源文件时也不会发生。为什么会有区别?有没有办法让这项工作?
答案 0 :(得分:1)
您确定您没有错过命令行中的任何-D
定义吗?由于条件限制,您的结果与未编译的部分一致。
另一种可能性(因为您没有具体命名编译器)是您使用通用gcc -E
而不是针对vxWorks环境的特定于arch的交叉编译器。 cross-gcc将预定义gcc -E
所需的一些变量。
答案 1 :(得分:1)
编译预处理输出时,请尝试传递-fpreprocessed
选项,告诉GCC不要再预处理。
我能想到的唯一区别是宏会导致扩展为已经扩展的宏名称的标识符 - 预处理器会在此时停止扩展,但如果再次运行预处理器,则会扩展标识符再次。我原以为这可能会导致编译错误,但谁知道呢?