欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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实现的函数和调用的函数的形参、返回值类型不一致。