解决 Undefined reference to 问题

链接时缺失了相关目标文件

这是最典型最常见的情况。比如新添加了一个模块fun.h fun.c两个文件,其他文件中使用了这个模块里的函数,如果编译时忘记加上这两个文件,调用fun模块函数的地方,就会报undefined reference错误。

这个问题在编辑器中一般不容易发现,因为头文件包含是正确的,编辑器能够找到相关的函数及其实现,所以在编写代码时不会报错。

链接时缺少相关的库文件

这个原因和上一条类似,我们在调用静态库中的函数时,编译时如果没有将静态库一起编译,就会报同样的错误。

链接的库文件中又使用了另一个库文件

在使用第三方库时,一定要在编译中加入第三方库的路径。

多个库文件链接顺序问题

在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免 undefined reference 的错误,完成编译链接。

声明与实现不一致

这个原因也比较典型,注意排查声明与实现的参数是否一致,返回值是否一致。

在 c++代码中链接 c 语言的库

C++代码中,调用了C语言库的函数,因此链接的时候找不到,解决方法是在相关文件添加一个extern "C"的声明即可。

总结

顾名思义,这个错误就是未定义你使用的内容导致的。所以要排查使用的内容是否能够被正确“找到”。使用的时候有没有声明,有没有定义,声明与定义是否一致,编译时能否正确链接等等。

相关参考

“undefined reference to” 问题汇总及解决方法