首页 > 解决方案 > Raspberry Pi (armhf) 交叉编译器无法编译包含库(例如 usb.h)的 C 代码

问题描述

我需要控制 Raspberry Pi 1 B+ 的 USB 端口,以便在不物理访问机器/电缆的情况下断开/重新连接 USB 设备。

我发现hub-ctrl.c这似乎很好(根据 raspberrypi.org 上的“Raspberry Pi B+ turn usb power off”主题),但必须对其进行编译。

而且我想从我的 Linux amd64 机器上完成它(这样我将来可以轻松编译其他东西),所以我需要一个交叉编译器(因为 Raspberry Pi 使用 ARM CPU)。

我正在使用abhiTronix/raspberry-pi-cross-compilers哪个有效(一个简单的 Hello World C 代码可以在 Raspberry Pi 上编译和运行就可以了)。

但是,hub-ctrl.c编译失败是因为 C 代码需要外部包含:#include <usb.h>.

$ wget https://raw.githubusercontent.com/codazoda/hub-ctrl.c/master/hub-ctrl.c
$ arm-linux-gnueabihf-gcc hub-ctrl.c -o hub-ctrl -lusb
hub-ctrl.c:12:10: fatal error: usb.h: No such file or directory
   12 | #include <usb.h>
      |          ^~~~~~~
compilation terminated.

我确实libusb为两种架构安装了开发包(在我的编译计算机上):

$ dpkg -l | grep libusb
ii  libusb-0.1-4:amd64     2:0.1.12-32 amd64 userspace USB programming library
ii  libusb-1.0-0:amd64     2:1.0.22-2  amd64 userspace USB programming library
ii  libusb-1.0-0:armhf     2:1.0.22-2  armhf userspace USB programming library
ii  libusb-1.0-0-dev:amd64 2:1.0.22-2  amd64 userspace USB programming library development files
ii  libusb-1.0-0-dev:armhf 2:1.0.22-2  armhf userspace USB programming library development files
ii  libusb-1.0-doc         2:1.0.22-2  all   documentation for userspace USB programming

我不明白如何告诉编译器它应该使用它(以及从哪个地方)。

安装的一部分abhiTronix/raspberry-pi-cross-compilers设置了LD_LIBRARY_PATH变量,但它不指向库文件所在的位置。

更新 1:

正如评论中所要求的,这里是libusb-1.0-0-dev软件包安装的文件列表:

$ dpkg -L libusb-1.0-0-dev:armhf
/.
/usr
/usr/include
/usr/include/libusb-1.0
/usr/include/libusb-1.0/libusb.h
/usr/lib
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libusb-1.0.a
/usr/lib/arm-linux-gnueabihf/pkgconfig
/usr/lib/arm-linux-gnueabihf/pkgconfig/libusb-1.0.pc
/usr/share
/usr/share/doc
/usr/share/doc/libusb-1.0-0-dev
/usr/share/doc/libusb-1.0-0-dev/README
/usr/share/doc/libusb-1.0-0-dev/changelog.Debian.gz
/usr/share/doc/libusb-1.0-0-dev/changelog.gz
/usr/share/doc/libusb-1.0-0-dev/copyright
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so

另外,我拥有的“usb”文件:

$ find / -iname "*usb*" | grep arm
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so.0.1.0
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so.0
/usr/lib/arm-linux-gnueabihf/libusb-1.0.a
/usr/lib/arm-linux-gnueabihf/pkgconfig/libusb-1.0.pc
# Omitting linux-headers, dpkg and apt paths
/opt/cross-pi-gcc-9.3.0-0/arm-linux-gnueabihf/libc/usr/include/sound/usb_stream.h
/opt/cross-pi-gcc-9.3.0-0/arm-linux-gnueabihf/libc/usr/include/linux/usb
/opt/cross-pi-gcc-9.3.0-0/arm-linux-gnueabihf/libc/usr/include/linux/usbdevice_fs.h
/opt/cross-pi-gcc-9.3.0-0/arm-linux-gnueabihf/libc/usr/include/linux/usbip.h

更新 2:

根据这个其他 StackOverFlow 问题,因为源代码使用#include <usb.h>我应该使用libusb-devDebian 包而不是libusb-1.0-0-dev.

我做到了,但没有改变编译结果:

$ apt-get install libusb-dev:armhf
$ dpkg -L libusb-dev:armhf
/.
/usr
/usr/bin
/usr/bin/libusb-config
/usr/include
/usr/include/usb.h
/usr/lib
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libusb.a
/usr/lib/arm-linux-gnueabihf/libusb.so
/usr/lib/arm-linux-gnueabihf/pkgconfig
/usr/lib/arm-linux-gnueabihf/pkgconfig/libusb.pc
# Omitting "/usr/share/doc" and "/usr/share/man"

标签: craspberry-picross-compilinglibusb

解决方案


推荐阅读