链接时缺失了相关目标文件
这是最典型最常见的情况。比如新添加了一个模块fun.h fun.c
两个文件,其他文件中使用了这个模块里的函数,如果编译时忘记加上这两个文件,调用fun
模块函数的地方,就会报undefined reference
错误。
这个问题在编辑器中一般不容易发现,因为头文件包含是正确的,编辑器能够找到相关的函数及其实现,所以在编写代码时不会报错。
链接时缺少相关的库文件
这个原因和上一条类似,我们在调用静态库中的函数时,编译时如果没有将静态库一起编译,就会报同样的错误。
链接的库文件中又使用了另一个库文件
在使用第三方库时,一定要在编译中加入第三方库的路径。
多个库文件链接顺序问题
在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免 undefined reference 的错误,完成编译链接。
声明与实现不一致
这个原因也比较典型,注意排查声明与实现的参数是否一致,返回值是否一致。
在 c++代码中链接 c 语言的库
在C++
代码中,调用了C
语言库的函数,因此链接的时候找不到,解决方法是在相关文件添加一个extern "C"
的声明即可。
总结
顾名思义,这个错误就是未定义你使用的内容导致的。所以要排查使用的内容是否能够被正确“找到”。使用的时候有没有声明,有没有定义,声明与定义是否一致,编译时能否正确链接等等。