【问题标题】:How can I know in which step (Pre-Processor,Compiling, Linking) my program failed to compile?我怎么知道我的程序在哪个步骤(预处理器、编译、链接)编译失败?
【发布时间】:2012-07-20 14:26:11
【问题描述】:

如何知道我的程序在哪个步骤(预处理器、编译、链接)编译失败?

例如,我写了一个包含3个源文件的程序:a.c ,b.c, c.c,这三个文件都包含了头文件h.h,其中包含了所有源文件的所有原型,但我也实现了一个功能,在头文件中。我知道这样做是错误的,但是我想知道程序在哪个阶段崩溃了,是链接还是编译,我收到一条错误消息,这是说问题出在链接阶段吗? (否则我只会在编译器的错误上加一条红色下划线?)

我在哪里可以阅读有关链接的信息,以及关于头文件和源文件以及链接错误我不应该做什么?

(我在 Linux 中工作,使用 Eclipse)

【问题讨论】:

  • 程序通常在运行时崩溃。你问的是编译失败而不是崩溃?
  • 确切的错误信息是什么?

标签: c header linker c-preprocessor


【解决方案1】:

通过分离编译和链接来找到错误的位置。由于预编译器的错误是不寻常的,并且在编译过程中也会发现。这就是编译在命令行上的工作方式:

编译步骤:

gcc -c -o a.o -pedantic -Wall a.c 
gcc -c -o b.o -pedantic -Wall b.c 
gcc -c -o c.o -pedantic -Wall c.c 

链接步骤:

gcc a.o b.o c.o -o prog

当然,您需要指定任何其他必要的标志(例如 -l 用于链接到库等)

然后仔细阅读错误和警告(!),你会发现问题。

【讨论】:

    【解决方案2】:

    您的程序崩溃只有在您对程序进行了预处理、编译和链接以生成可以运行的可执行文件后。崩溃是运行时错误。

    重新预处理/编译/链接

    您没有指定您在哪个平台/环境中工作,但是在 Linux/Unix 环境中很容易确定您是否遇到了链接器问题,因为您通常会收到带有 ld 的消息。

    编译错误通常与语法相关并且易于识别(例如,不匹配的括号、缺少分号等)(此外,作为一般规则,我建议您始终使用最高警告级别,然后有意识地确定要忽略哪些警告消息。)

    我不在系统上,我可以尝试一下,所以我不确定预处理器是否会抛出特定的易于识别的错误/警告消息,或者它们是否只是传递给编译器并被吐出在那个阶段出来。

    这些步骤都不会使您的程序崩溃,只有在所有这些步骤都成功完成后才会发生(如果确实如此)。

    【讨论】:

    • 抱歉,我编辑了问题。我的意思是编译失败而不是崩溃。
    • @Numerator .. 刚刚注意到,希望我的回答有帮助。
    • 预处理部分中的错误会导致其他可能影响编译和/或链接的错误-
    • @steffen 是的,这是真的(并且是意料之中的),因为 PP 将其输出传递给编译器,然后编译器又传递给链接器
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多