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

Compiler does not give line number of error undefined reference

提问人:newbie_developer93 提问时间:6/20/2018 最后编辑:Communitynewbie_developer93 更新时间:6/25/2018 访问量:1505

问:

为什么编译器有时不给出错误的行号?该“未定义引用”的用例在哪里。我已经将所有内容作为我自己编写的头文件包含在内,因此它需要给出特定的行号。它不是闭源的。我是不小心更改了编译器的某些设置,还是另一回事,不管那是什么?

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我就设法编译并运行了该应用程序。

c 编译器错误 mingw undefined-reference

评论

0赞 Basile Starynkevitch 6/20/2018
您应该考虑使用gcc -Wall -g

答:

4赞 Steve Summit 6/20/2018 #1

该错误来自“链接器”(),而不是编译器本身。ld

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

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

但是,由于链接器使用的是对象文件,因此通常它不知道最初调用函数的源文件行号。

(一些 C 编译器与其链接器更紧密地协作,因此这些“未定义的外部”错误消息可以更有用地包含实际的源文件行号,但这是一个相对较新的创新。为此,在启用调试的情况下进行编译可能很重要,例如使用标志,以便编译器在其目标文件中包含源代码行号信息。-g

评论

0赞 Basile Starynkevitch 6/20/2018
在 Linux 上,某些链接器能够使用 DWARF 调试信息来报告行号
0赞 Steve Summit 6/20/2018
@BasileStarynkevitch是的,只是补充了这一点。