Linux下链接相互依赖的.a文件遇到undefined reference问题总结
2012-09-28 11:35
633 查看
转自:http://www.coder4.com/archives/1601
最近,在Linux下静态链接多个相互依赖的.a文件时,遇到各种诡异的undefined reference问题,最后发现,是.a文件的链接顺序竟然非常重要!转载自:http://ticktick.blog.51cto.com/823160/431329
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:
view source
print?
1 | (.text+0x13): undefined reference to `func' |
1. 链接时缺失了相关目标文件(.o)
测试代码如下:
![](http://img1.51cto.com/attachment/201011/133144914.png)
然后编译。
view source
print?
1 | gcc -c test .c |
2 | gcc –c main.c |
view source
print?
1 | gcc -o main main.o |
view source
print?
1 | main.o: In function `main': |
2 | main.c:(.text+0x7): undefined reference to ` test ' |
3 | collect2: ld returned 1 exit status |
view source
print?
1 | gcc -o main main.o test .o |
view source
print?
1 | gcc -o main main.c//缺少 test ()的实现文件 |
view source
print?
1 | gcc -o main main.c test .c //ok,没问题了 |
在此,只举个静态库的例子,假设源码如下。
![](http://img1.51cto.com/attachment/201011/133734483.png)
先把test.c编译成静态库(.a)文件
view source
print?
1 | gcc -c test .c |
2 | ar -rc test .a test .o |
view source
print?
1 | gcc -cmain.c |
view source
print?
1 | gcc -o main main.o |
view source
print?
1 | /tmp/ccCPA13l.o: In function `main': |
2 | main.c:(.text+0x7): undefined reference to ` test ' |
3 | collect2: ld returned 1 exit status |
view source
print?
1 | gcc -o main main.o./ test .a //注:./ 是给出了 test .a的路径 |
view source
print?
1 | gcc -o main main.c./ test .a //同样,如果不加 test .a也会报错 |
这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。
![](http://img1.51cto.com/attachment/201011/134157339.png)
从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数。
首先,我们先对fun.c,test.c,main.c进行编译,生成 .o文件。
view source
print?
1 | gcc -cfunc.c |
2 | gcc -c test .c |
3 | gcc -cmain.c |
view source
print?
1 | ar –rcfunc.a func.o |
2 | ar –rc test .a test .o |
view source
print?
1 | gcc -o main main.o test .a |
view source
print?
1 | test .a( test .o): In function ` test ': |
2 | test .c:(.text+0x13): undefined reference to `func' |
3 | collect2: ld returned 1 exit status |
view source
print?
1 | gcc -o main main.o test .a func.a |
4 多个库文件链接顺序问题
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?
view source
print?
1 | gcc -o main main.ofunc.a test .a |
view source
print?
1 | test .a( test .o): In function ` test ': |
2 | test .c:(.text+0x13): undefined reference to `func' |
3 | collect2: ld returned 1 exit status |
5. 总 结
当然,上面几种是我目前发现的比较常见的undefined reference错误的原因和解决方法,可能也有其他各种原因,欢迎大家来信lujun.hust@gmail.com交流,对本文档进行补充,方面新手们解决学习过程中遇到的各种问题。
相关文章推荐
- Linux下链接相互依赖的.a文件遇到undefined reference问题总结
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- Linux下链接库出现的undefined reference问题总结
- linux链接时提示"undefined reference to" 问题解决方法
- linux undefined reference问题总结!
- Linux下编译C++程序遇到错误:undefined reference to '***'
- Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
- Linux 链接MySQL出错 undefined reference to `mysql_init'
- 使用Hadoop API操作HDFS文件时遇到的问题及解决总结
- 【Linux--工作记录】工作中遇到的问题总结--更新中
- 收藏一个实用技巧:linux下查看动态链接库so文件的依赖的相关组建发布时间
- Linux下undefined reference to ‘pthread_create’问题解决
- Linux:文件编程学习中遇到的问题
- 在虚拟机上装linux OS的遇到的问题总结
- undefined reference问题总结
- undefined reference to涉及的链接问题
- Linux下运行多线程——undefined reference to 'pthread_create'问题两种解决方法