1、这个问题的根因是什么?
首先看一下这个错误提示的一个翻译:"undefined reference to xxx",未定义的引用xxx,我们知道编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这四个过程,这个问题的一般出现在链接过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一个整体;实际应用过程中最常见的就是将不同的库文件进行链接生成可执行文件,每个库文件代表一个目标文件,比如我们libaaa.a库里有用到库libbbbb.a中定义的函数foo,我们称目标文件libaaa.a引用libbbb.a的foo函数;在目标文件里,每个变量和函数都有自己独特的名字,就是为了避免链接过程中不同的变量和函数之间的混淆,我们将函数和变量称为符号,函数名和变量名就是符号名;每一个库文件也就是目标文件在生成的过程中都会有一个符号表,这个符号表就是库的代码里所有用到的符号(函数和变量),每一个符号对应一个值,叫做符号值,也就是符号的地址;符号表里有符号和对应的地址,如果是在库的内部定义的全局变量,地址则是在库的内部;如果是引用其他库的函数或变量,就先将该地址空起来,等链接的时候再把这个地址重定位,这时候我们就知道这个错误的根因了,就是链接的时候,这个地址在其他库里没有找到,填充不了这个地址,才报这个错误;
2、那么为什么没有找到这个地址呢?
(1)首先就要看这个未定义的函数是不是在其他库里是不是已经定义了?如果能看代码的话,就看下代码,不能看代码的话,直接使用命令readelf -s 目标文件(.o文件),这个命令可以看下目标文件里所有的符号表信息,看下这个函数是不是在定义在这个目标文件;
(2)如果找到定义了,就看下这个函数是不是在特殊的命名空间下,导致链接的时候找不到引用的地址;在使用的编码时,最多的也就是这种情况,首先对比一下定义这个函数的对应的头文件和要引用这个函数的目标文件的头文件是否一致;至于其他的externa “C”这个解释,暂时还没看,后续如果明白了,再补上;