undefined reference to

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值