undefined reference to
程序员文章站
2022-07-08 14:44:01
...
undefined reference to …
参考文献:
[1] https://blog.csdn.net/stpeace/article/details/73302833
[2] https://latedev.wordpress.com/2014/04/22/common-c-error-messages-2-unresolved-reference/
"undefined reference to …"是C++编程中非常常见的一类错误,出现在程序的链接过程(linker),程序需要经过编译(compiler)、链接(linker)才能生成可执行文件。链接过程中会将编译生成的多个.o
文件转链接成可执行文件,若这个过程中出现某个引用(调用)的函数找不到实现文件,则会出现链接错误undefined reference
出现这类错误可从以下几个方便进行追溯:
1. 链接时缺少相关库文件
比如main.c文件和test.c文件
main.c
#include <stdio.h>
int main(){
printf("%d", func(10));
}
test.c
int func(int n){
return n;
}
当执行:
gcc main.c -c
gcc main.o -o main
会出现错误"undefined reference"。正确的是:
gcc main.c -c
gcc test.c -c
gcc main.o test.o -o main
2. 缺少相应的库文件
以第一个例子做解释,若将test.c
编译成库文件,main.c
在链接时需要链接这个库文件。
正确的执行:
gcc test.c -c
ar -rc test.a test.o # test.a, generate static lib
gcc main.c -c # main.o
gcc main.o test.a -o main
3. 多个(库)文件链接顺序
这类错误非常隐蔽,建议分析库文件之间的依赖关系,将依赖其他库的库放在被依赖的库的前面。
1.-3.是代码本身没有错误,但是链接的方式出现错误。其实若代码编写有误,也会出现"undefined reference"。
4. (只有声明)没有定义
比如:
int foo();
int main(){
foo();
}
今天的博客主要是因为这个错误而写的,在调试LevelDB时自定义了函数却没有,在version_set.h
里面声明了,在相应.cc
里面没实现。
5. 声明、定义(实现)、调用三者不一致
这个在调试LevelDB的时候也出现过,在xx.h
声明的函数、在xx.cc
实现的函数和调用的函数的形参、返回值类型不一致。
推荐阅读
-
javascript类型系统——undefined和null全面了解
-
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
-
Notice: Undefined index: page in E:PHP est.php on line 14
-
PHP Undefined index报错的修复方法
-
配置c3p0-config.xml数据库连接池,jdbcurl配置项报错Type The reference to entity "useUnicode" must end with the ';' delimiter.
-
Windows编译OpenCV4Android解决undefined reference to std错误
-
Notice: Undefined index: page in E:PHP est.php on line 14
-
php运行出现Call to undefined function curl_init()的解决方法
-
Apache启动提示错误undefined symbol: libiconv_open解决方法
-
php Notice: Undefined index 错误提示解决方法