为什么编译器有时不给出错误的行号? “未定义引用”的用例在哪里。我已经将所有内容作为我自己编写的头文件包括在内,因此需要提供特定的行号。它不是封闭源。我是否偶然更改了编译器的某些设置,或者是另一回事吗?
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):对`drawImagePartScaledHW'的未定义引用 collect2.exe:错误:ld返回1退出状态
编辑:我已经解决了问题。我包含了draw.h的两个不同版本,一个来自软件渲染器,另一个来自OpenGL渲染器。由于他们使用相同的
#ifndef DRAW_H
#define DRAW_H
...
#endif
两个文件的结构;编译器不包含第二个。将DRAW_H更改为DRAW_HW后,我设法编译并运行该应用程序。
答案 0 :(得分:2)
该错误来自“链接器”(ld
),而不是编译器本身。
通常,编译器将每个源文件编译成自己的单独的目标文件,仅包含该源文件中的代码和数据。然后,链接器将一个或多个目标文件组合在一起,并链接任何所需的库函数。
至关重要的是,如果单个源文件(单个目标文件)调用未定义的函数没有问题-这很正常,如果该函数的定义位于另一个源文件或库中。因此,这就是为什么链接程序(而不是编译器)最终发现在任何地方都没有函数的定义,而它实际上是未定义的。
但是,由于链接器正在处理目标文件,因此通常不知道函数最初在哪个源文件行号上调用。
(某些C编译器与它们的链接器更紧密地协作,因此这些“未定义的外部”错误消息可以更有用地包含实际的源文件行号,但这是相对较新的创新。对此起作用可能很重要以启用调试功能进行编译,例如使用-g
标志,以便编译器在其目标文件中包含源行号信息。)