免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14744 | 回复: 9
打印 上一主题 下一主题

[应用] 交叉编译一个基于libusb库的小程序,链接时提示找不到函数。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-03 16:00 |只看该作者 |倒序浏览
本帖最后由 冬天的落阳 于 2012-05-03 16:02 编辑

你点进来看了?谢谢围观,但是事情不像你想象的那么简单。。。。。


简单描述:链接时已经指定了库文件路径,显然编译器也能找到该文件(不然它会说的),但是仍然提示:usb2ram.c: (.text+0x710): undefined reference to `usb_init' 等信息。

详细描述(为了不浪费大家猜测的时间,写的很详细。。。。):
我想在一块s3c2410的开发板上,做一个简单的应用程序通过usb接口从主机(ubuntu,2.6.32)下载文件。于是网上找到了usb2ram,很小巧的程序源码,不过需要libusb支持。
初步测试,在主机上运行编译、配合usb-vivi使用,都OK。

接下来我想把代码移植到开发板上。没有改动代码,先交叉编译看看能否通过。

1.交叉编译libusb--OK。
官网下载libusb1.0,用4.4.3的交叉编译器进行交叉编译,OK,无问题。
生成的静态和动态库:libusb-1.0.a  libusb-1.0.la  libusb-1.0.so  libusb-1.0.so.0  libusb-1.0.so.0.1.0 ,都拷贝到交叉编译工具的lib中了。
头文件:libusb.h  
注意,该源码中不含usb.h

2.交叉编译usb2ram代码。为了大家看的方便,我就不贴makefile了,把终端里的最终命令写出来:

# /home/username/toolschain/4.4.3/bin/arm-linux-gcc -static -o a.out usb2ram.c  -I/usr/include  -lm -lusb-1.0
/tmp/ccQa2wq4.o: In function `find_qt2410_device':
usb2ram.c: (.text+0x1f0): undefined reference to `usb_busses'
/tmp/ccQa2wq4.o: In function `qt2410_send_file':
usb2ram.c: (.text+0x4ac): undefined reference to `usb_bulk_write'
/tmp/ccQa2wq4.o: In function `main':
usb2ram.c: (.text+0x710): undefined reference to `usb_init'
usb2ram.c: (.text+0x714): undefined reference to `usb_find_busses'
usb2ram.c: (.text+0x72c): undefined reference to `usb_find_devices'
usb2ram.c: (.text+0x7c: undefined reference to `usb_open'
usb2ram.c: (.text+0x7ec): undefined reference to `usb_strerror'
usb2ram.c: (.text+0x81: undefined reference to `usb_claim_interface'
usb2ram.c: (.text+0x82c): undefined reference to `usb_strerror'
collect2: ld returned 1 exit status

大家可以看到,我在静态链接的时候已经注意了-l的顺序了。。。。

有人说你试试动态链接?唉,我都搞了大半天了,能没试过吗:

# /home/username/arm-kernel/toolschain/4.4.3/bin/arm-linux-gcc -o a.out usb2ram.c  -I/usr/include  -lm -lusb-1.0
/tmp/ccAHTRjz.o: In function `find_qt2410_device':
usb2ram.c: (.text+0x1f0): undefined reference to `usb_busses'
/tmp/ccAHTRjz.o: In function `qt2410_send_file':
usb2ram.c: (.text+0x4ac): undefined reference to `usb_bulk_write'
/tmp/ccAHTRjz.o: In function `main':
usb2ram.c: (.text+0x710): undefined reference to `usb_init'
usb2ram.c: (.text+0x714): undefined reference to `usb_find_busses'
usb2ram.c: (.text+0x72c): undefined reference to `usb_find_devices'
usb2ram.c: (.text+0x7c: undefined reference to `usb_open'
usb2ram.c: (.text+0x7ec): undefined reference to `usb_strerror'
usb2ram.c: (.text+0x81: undefined reference to `usb_claim_interface'
usb2ram.c: (.text+0x82c): undefined reference to `usb_strerror'
collect2: ld returned 1 exit status

出错信息一样一样儿的。。。。


从出错信息推断,肯定找到对应的库文件了,但是就是找不到函数。我查看了库文件:
$ file libusb-1.0.a libusb-1.0.so.0.1.0
libusb-1.0.a:        current ar archive
libusb-1.0.so.0.1.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

没看出什么问题来。
其间还尝试了4.3.2的交叉编译器,一样的问题。

强调一下,该代码在主机上编译、使用都很OK。

那么,高手们啊,问题可能在哪里呢?

提供usb2ram源代码,有额外兴趣的话也可以下载: usb2ram.tar.gz (9 KB, 下载次数: 48)

论坛徽章:
0
2 [报告]
发表于 2012-05-03 16:44 |只看该作者
调试了大半天,脑子已经一筒浆糊了。有人指点一下吗?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2012-05-03 19:23 |只看该作者
回复 1# 冬天的落阳
/home/username/toolschain/4.4.3/bin/arm-linux-gcc -static -o a.out usb2ram.c  -I/usr/include  -lm -lusb-1.0

在家没有测试环境,只能猜测一下:
你的libusb-1.0.a在哪里存放?是否用-L指定路径尝试过?

论坛徽章:
0
4 [报告]
发表于 2012-05-03 19:47 |只看该作者
nm一下lib呢?难道strip过了?确实很奇怪,静态库的顺序也对

论坛徽章:
0
5 [报告]
发表于 2012-05-03 21:12 |只看该作者
如四楼所言,你先用nm看一下库里是否有该函数吧

论坛徽章:
0
6 [报告]
发表于 2012-05-03 21:13 |只看该作者
回复 3# 瀚海书香

libusb的库文件我都拷贝到toolchain的默认lib库目录了。
据我分析,不是因为找不到库文件的原因,找不到库文件肯定会有提示的。


   

论坛徽章:
0
7 [报告]
发表于 2012-05-03 21:15 |只看该作者
本帖最后由 冬天的落阳 于 2012-05-03 21:20 编辑

回复 4# liwangli1983

回4 5楼:

我之前有用file命令看过:
libusb-1.0.so.0.1.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
可以看出,这个动态库没有strip过。
不过我没有用nm命令查看过,现在在家里,改天到办公室试试看。

论坛徽章:
0
8 [报告]
发表于 2012-05-03 21:27 |只看该作者
usb.h  在哪里?

试一试: -I /usr/local/include

http://www.arm9home.net/simple/index.php?t2781.html

论坛徽章:
0
9 [报告]
发表于 2012-05-07 16:19 |只看该作者
水落石出!
唉,被电脑调戏了,严重调戏。

依照4 5楼所言,用nm查看了一下编译出来的libusb-1.0.so.0.1.0,完全找不到诸如usb_init之类的函数,难怪链接器说找不到。倒是能找到libusb_init这样的函数。

我想可能是1.0的版本更新了,函数名称也变了吧,但是这样做兼容性实在太差,搞个宏define一下也好啊。

紧接着的一个疑问就是为什么电脑上编译没问题?
用$ dpkg -l|grep ii |grep libusb发现,电脑上存在两个版本的libusb!分别是 libusb-0.1-4  、 libusb-1.0-0   
两个版本,链接时用的哪个?
ls -l  /usr/bin/libusb*
libusb.so -> /lib/libusb-0.1.so.4.4.4
合着我在电脑上装的libusb1.0版本压根就没用着。。。。。
不带这么坑人的啊啊啊

接着下载libusb0.1版本,虽然编译链接遇到点小意外,但是情况一直在我掌握中,最后编译出来了相关的库文件。

结贴。

论坛徽章:
0
10 [报告]
发表于 2012-05-08 15:58 |只看该作者
在主机编的时候,没有强制指定库的路径啊……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP