1

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

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

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

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

4

2 回答 2

2

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

编译步骤:

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 用于链接到库等)

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

于 2012-07-20T14:41:23.653 回答
1

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

重新预处理器/编译/链接

您没有指定您正在使用的平台/环境,但在 Linux/Unix 环境中,很容易确定您是否遇到了链接器问题,因为您通常会收到带有ld.

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

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

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

于 2012-07-20T14:30:07.017 回答