我正在尝试编写一个将数据传输到我的设备的程序。我正在使用 libusb。我在 Ubuntu 16 LTS 的 32 位和 64 位版本中安装其软件包时遇到了很多问题。安装命令:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libusb-1.0-0-dbg
还尝试过:http://www.linuxfromscratch.org/blfs/view/svn/general/libusb.html
在 Ubuntu 64 位中“dpkg -l libusb*”显示已安装,而在 32 位中则显示“没有这样的包……”。
编译命令:
sudo gcc -g -o usbtest usbtest.c -lusb-1.0
在 Ubuntu 64 位中它可以编译,而在 32 位中出现以下提示:
/usr/bin/ld: cannot find -lusb-1.0
collect2: error: ld returned 1 exit status
但我确信它存在,然后我尝试按照命令进行操作,并且编译时没有任何错误。
sudo gcc -g -o usbtest usbtest.c -L/usr/local/lib -lusb-1.0
最后当我执行我的程序时,它找不到我的设备,换句话说无法打开该设备。以下介绍 Ubuntu(32 位和 64 位)中的调试过程:
141 int r = 1;
(gdb) s
143 r = libusb_init(NULL);
(gdb)
libusb_init (context=0x0) at ../../libusb/core.c:1983
1983 ../../libusb/core.c: No such file or directory.
(gdb)
1985 in ../../libusb/core.c
(gdb)
__GI_getenv (name=0xb7fb2f16 "LIBUSB_DEBUG") at getenv.c:34
34 getenv.c: No such file or directory.
(gdb)
__x86.get_pc_thunk.bx () at ../sysdeps/i386/i686/multiarch/../memcmp.S:80
80 ../sysdeps/i386/i686/multiarch/../memcmp.S: No such file or directory.
(gdb)
__GI_getenv (name=0xb7fb2f16 "LIBUSB_DEBUG") at getenv.c:35
35 getenv.c: No such file or directory.
(gdb)
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:43
43 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
(gdb)
44 in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
我不知道我该怎么办。
答案1
我不完全确定您想要实现什么;您是否需要 libusb 在 32 位和 64 位上运行?还是只需要其中一个?无论如何,必须专门为正确的体系结构安装库。默认情况下,安装命令只会安装其“自己的”版本的库。您可以明确告诉它安装两个版本:
sudo apt-get install libusb-1.0-0-dev:i386
sudo apt-get install libusb-1.0-0-dev:amd64
分别为 32 位和 64 位。您也可以直接检查库文件,在我的系统 (16.04) 上,它们位于
32bit: /usr/lib/i386-linux-gnu/
64bit: /usr/lib/x86_64-linux-gnu
(如果您有疑问,dpkg-query -L libusb-1.0-0-dev
请显示它们的安装位置。)
至于您自己编译的 libusb,您需要在链接程序时跟踪您使用的是正确的版本。也许您在 /usr/local/lib 中混合了 32 位和 64 位版本?那么 gcc / ld 就不知道将它们分开了。
至于调试会话,gdb 只是试图向您显示源代码行,但不知道在哪里找到库的源文件。否则我看不出这里有什么明显错误。