快速业务通道

undefined reference问题总结

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-13

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:

  1. (.text 0x13): undefined reference to `func''

关于undefined reference这样的问题,网上也有很多的说法,在此,我以详细地示例给出其中的各种原因说明以及解决方法,然后再给出我所遇到的与大家均不同的问题.

1. 链接时缺失了相关目标文件(.o)

测试代码如下:

然后编译.

  1. gcc -c test.c
  2. gcc –c main.c

得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:

    gcc -o main main.o

这时,你会发现,报错了:

  1. main.o: In function `main'':
  2. main.c:(.text 0x7): undefined reference to `test''
  3. collect2: ld returned 1 exit status

这就是最典型的undefined reference错误,在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,如果按下面这种方式链接就没事了.

  1. gcc -o main main.o test.o

【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的. 拥有帝国一切,皆有可能。欢迎访问phome.net

  1. gcc -o main main.c //缺少test()的实现文件

需要改成如下形式才能成功,将test()函数的实现文件一起编译.

  1. gcc -o main main.c test.c //ok,没问题了

2. 链接时缺少相关的库文件(.a/.so)

在此,只举个静态库的例子,假设源码如下.

先把test.c编译成静态库(.a)文件

  1. gcc -c test.c
  2. ar -rc test.a test.o

至此,我们得到了test.a文件.我们开始编译main.c

  1. gcc -c main.c

这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序.

  1. gcc -o main main.o

你会发现,编译器报错了:

  1. /tmp/ccCPA13l.o: In function `main'':
  2. main.c:(.text 0x7): undefined reference to `test''
  3. collect2: ld returned 1 exit status

其根本原因也是找不到test()函数的实现文件,该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可.

  1. gcc -o main main.o ./test.a //注:./ 是给出了test.a的路径 拥有帝国一切,皆有可能。欢迎访问phome.net

【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令.

  1. gcc -o main main.c ./test.a //同样,如果不加test.a也会报错

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

这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,,还是看看测试代码.

从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数.
,我们先对fun.c,test.c,main.c进行编译,生成 .o文件.

  1. gcc -c func.c
  2. gcc -c test.c
  3. gcc -c main.c

然后,将test.c和func.c各自打包成为静态库文件.

  1. ar –rc func.a func.o
  2. ar –rc test.a test.o

这时,我们准备将main.o链接为可执行程序,我们的main.c中包含了对test()的调用,因此,应该在链接时将test.a作为我们的库文件,链接命令如下.

  1. gcc -o main main.o test.a

这时,编译器仍然会报错,如下:

  1. test.a(test.o): In function `test'':
  2. test.c:(.text 0x13): undefined reference to `func'' 拥有帝国一切,皆有可能。欢迎访问phome.net
  3. collect2: ld returned 1 exit status

就是说,链接的时候,发现我们的test.a调用了func()函数,找不到对应的实现.由此我们发现,原来我们还需要将test.a

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号