我怎么知道我的程序在编译失败的哪一步(预处理器,编译,链接)?
例如,我编写了一个包含3个源文件的程序:a.c ,b.c, c.c
,其中所有三个文件都包含头文件h.h
,其中包含所有源文件的所有原型,但我也是在头文件中实现了一个函数。我知道这样做是错的,但我想知道程序在什么阶段崩溃,是链接还是编译,我收到了一条错误消息,这是说问题是在链接阶段吗? (否则我只会从编译器的错误中得到一个红色下划线?)
我在哪里可以阅读有关链接以及我不应该对标题和源文件以及链接错误做些什么?
(我在Linux中工作,使用Eclipse)
答案 0 :(得分: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用于链接到库等)。
然后仔细阅读错误和警告(!),你会发现问题。
答案 1 :(得分:1)
只有在预先执行,编译和链接程序以生成可运行的可执行文件后,程序才会崩溃。崩溃是运行时错误。
重新预处理器/编译/链接:
您没有指定您正在使用的平台/环境,但在Linux / Unix环境中,很容易确定您是否遇到链接器问题,因为您通常会收到ld
的消息。
编译错误通常与语法相关且易于识别(例如,不匹配的parens,缺少分号等)(除此之外,作为一般规则,我建议您始终使用最高警告级别,然后有意识地确定要忽略哪些警告消息。)
我不在系统中,我可以尝试一下,所以我不确定预处理器抛出特定的易于识别的错误/警告消息,或者他们是否只是传递给编译器并获得吐在那个阶段。
这些步骤都不会导致程序崩溃,只有在所有这些步骤成功完成后才会发生(如果有)。