c/c++错误之 Undefined reference 未定义的问题
首先看一看链接器的作用。在构建c++程序的时候,几乎所有的程序都由多个c++源文件组成。使用c++编译器分别编译这些文件,以生成包含机器代码的目标文件(.o 或者 .obj 文件),每个目标文件对其他文件一无所知。所以,如果从另一个目标文件中存在的一个目标文件调用函数,则编译器将无法提供被调用函数的地址。
一旦生成了所有的目标文件,想要生成最终的可执行文件,那么链接器就会查看他们并计算出可执行文件中函数的最终地址是什么。然后他修补了编译器无法提供的地址。对于可能使用的任何库(.a 和 .lib 文件) ,他都执行相同的操作。最后,他将可执行文件写到磁盘。
链接器通常是与编译器分开的程序,例如:gcc 链接器成为 ld。传统上,链接器技术落后于编译器,主要是因为构建编译器比构建链接器通常更加有趣。并且链接程序不一定有权访问他们正在链接的目标文件的源代码。
好了,清楚了这个,未定义的错误就很明显了。“undefined reference” 错误意味着程序中的名称(函数、变量、常量等)具有引用,链接器在查找时找不到其定义。
比如:1: 调用的函数真的没有定义。 2: 定义的函数或其他与声明的不一样
注意:头文件(.h文件)不是库。链接器既不知道也不在乎头文件,他只在乎 .a 和 .lib 文件。因此,如果出现使用的库中出现了链接错误,则很大概率是因为没有和这个库建立链接。
后记:未解决的问题可能有很多种原因,但是这些错误都不是无缘无故的发生的,发生错误总意味着代码里面或者项目的配置当中做错了什么。我们只需要坐下来,想一想整体的流程,逻辑性的思考出现问题的原因,并弄清楚为什么?不要放弃,连前人已经研究好的东西拿来用出错都想放弃,那还如何去创新一个新的东西。