【问题标题】:Compiling previously preprocessed file changes output编译先前预处理的文件更改输出
【发布时间】:2012-02-10 15:27:20
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我正在修改创建目标文件的规则,只需添加 -E- 和 -P- 标志,而不删除任何内容,所以我很确定我使用的是正确的编译器并拥有所有定义。
    【解决方案2】:

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

    我能想到的唯一区别是宏会导致扩展为已扩展的宏名称的标识符 - 预处理器此时停止扩展,但如果您再次运行预处理器,标识符将被扩展再次。我本来预计这种情况的任何实例都可能导致编译器错误,但谁知道呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多