通过进入预处理,编译,汇编和链接进行调试

时间:2010-01-03 04:05:47

标签: gcc assembly compilation linker c-preprocessor

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

#abcdefg

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

int fight!now;

链接错误:`myfunc'由never defined声明:

extern int myfunc();

int main() {
    return myfunc();
}

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