编译器不给出错误未定义引用的行号

Compiler does not give line number of error undefined reference

为什么编译器有时不给出错误的行号? "undefined reference" 的用例在哪里?我已经将所有内容作为我自己编写的头文件包含在内,因此它需要提供特定的行号。它不是闭源的。我是否意外更改了编译器的某些设置,或者这是另一回事吗?

D:\Projects\DanceOfPixels\GLEW>gcc main.c glad.c -IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -lmingw32 -lopengl32 -lSDL2main -lSDL2 -lSDL2_image -o main.exe -ansi -std=c89 -pedantic -w C:\Users\user\AppData\Local\Temp\ccMooHZm.o:main.c:(.text+0x126ce): undefined reference to `drawImagePartScaledHW' collect2.exe: error: ld returned 1 exit status

编辑: 我已经解决了这个问题。我包含了两个不同版本的 draw.h,一个来自软件渲染器,另一个来自 OpenGL 渲染器。因为他们使用相同的

#ifndef DRAW_H
#define DRAW_H

...

#endif

两个文件的结构;编译器不包括第二个。将 DRAW_H 更改为 DRAW_HW 后,我设法编译并 运行 应用程序。

该错误来自 "linker" (ld),而不是编译器本身。

通常,编译器将每个源文件编译成它自己的单独目标文件,其中仅包含该源文件中的代码和数据。然后,链接器将一个或多个目标文件组合在一起,并链接到任何需要的库函数。

至关重要的是,如果单个源文件(单个目标文件)调用未定义的函数,那是没有问题的——如果函数的定义在另一个源文件或库中,那是正常的。所以这就是为什么链接器(而不是编译器)最终发现函数在任何地方都没有定义,它确实是未定义的。

但是由于链接器正在处理目标文件,通常它不知道函数最初是在哪个源文件行号上调用的。

(一些 C 编译器与它们的链接器工作得更紧密,因此这些 "undefined external" 错误消息可以更有用地包含实际的源文件行号,但这是一项相对较新的创新。要实现这一点在启用调试的情况下进行编译可能很重要,例如通过使用 -g 标志,以便编译器在其目标文件中包含源代码行号信息。)