【问题标题】:Debug via going into preprocessing, compilation, assembly and linking通过进入预处理、编译、汇编和链接进行调试
【发布时间】:2010-01-03 04:05:46
【问题描述】:

有时当 gcc 输出错误时,会通过 -E、-S 和 -c 等选项将预处理、编译、组装、链接的每个阶段的过程分解。这里是an example

我只是想知道这四个阶段中的每一个阶段都会发生哪些类型的错误,如果在其中一个阶段发生了一个错误,但在之前的阶段没有,这将如何指导您找到错误的原因并纠正吗?

【问题讨论】:

    标签: gcc assembly compilation linker c-preprocessor


    【解决方案1】:

    如果我记得每个术语的含义:

    • 预处理是解释/执行所有以#开头的行,如果后面的内容未被识别为具有有效语法,则会报告错误;
    • 编译是将源代码翻译成目标代码的事实;如果不尊重语言的语法,会报错;
    • 链接是获取一个或多个目标文件并从中创建一个可执行文件的事实,从而验证声明和使用的所有内容是否也已定义。

    预处理错误:`abcdefg' 不是有效的关键字,因此预处理将失败:

    #abcdefg
    

    编译错误:`fight!now' 不是有效标识符,因此编译将失败:

    int fight!now;
    

    链接错误:`myfunc' 声明为从未定义:

    extern int myfunc();
    
    int main() {
        return myfunc();
    }
    

    您知道,了解工具链检测到错误的位置有助于了解可能是哪种错误。但通常工具链发出的消息足以了解错误所在。当然,它需要习惯于将参数传递为 -Wall 甚至 -Wextra 以获得更多关于可能出现问题的警告。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2011-08-29
      • 1970-01-01
      • 2015-07-14
      • 2022-01-21
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多