【问题标题】:Compiler does not give line number of error undefined reference编译器未给出错误未定义引用的行号
【发布时间】:2018-11-29 18:47:21
【问题描述】:

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

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:错误:ld 返回 1 个退出状态

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

#ifndef DRAW_H
#define DRAW_H

...

#endif

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

【问题讨论】:

  • 你应该考虑用gcc -Wall -g编译all你的代码

标签: c compiler-errors mingw undefined-reference


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在 Linux 上,一些链接器能够使用 DWARF 调试信息来报告行号
  • @BasileStarynkevitch 是的,只是在添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2012-10-16
  • 2015-03-07
  • 2013-12-25
相关资源
最近更新 更多