linux 常用工具的静态编译之二
目录
libusb-1.0 >= 1.0.9) were not met:
libusb编译
配置及编译
安装
(libudev >= 196) were not met:
libudev的使用
names的修改
configure的修改
usb-utils的配置编译
总结
本文介绍usb-utils的编译。
libusb-1.0 >= 1.0.9) were not met:
Index of /pub/linux/utils/usb/usbutils/
版本下载,此处以010版本为例子 usbutils-010/
./configure \--host=aarch64-linux-gnu \--enable-static \--disable-shared \--prefix=$PWD/install \--disable-system-libusb \ # 强制使用内置实现CC=aarch64-linux-gnu-gcc \CFLAGS="-static" \LDFLAGS="-static -lpthread "
报错误:
configure: error: Package requirements (libusb-1.0 >= 1.0.9) were not met:
libusb编译
配置及编译
Release v1.0.24: libusb 1.0.24 · libusb/libusb · GitHub
这里下载1.0.24版本
./configure --host=aarch64-linux-gnu \--prefix=/opt/libusb-aarch64-static \--enable-static \--disable-shared --disable-udev
readelf -h ./libusb/.libs/libusb-1.0.a 确认编译出的库为我们需要的aarch64
安装
安装比较简单,通过make install即可,关键是记录安装的路径
/bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/opt/libusb-aarch64-static/lib'
这里安装路径包括了编译usb-utils需要的头文件和库
ls /opt/libusb-aarch64-static
include lib
(libudev >= 196) were not met:
这个是最麻烦的。新版本的libudev集成到了systemd里面,而systemd的编译异常啰嗦。
libudev的使用
usbutils-010/names.c 使用libudev库,其他的代码没有使用libudev,此文件的作用如下:
-
USB 标识符到名称的转换
-
将 USB 规范中的各种数字代码转换为可读字符串:
-
厂商ID → 厂商名称(如
0x0781
→ "SanDisk") -
产品ID → 产品名称(如
0x5581
→ "Ultra Fit USB 3.0") -
设备类/子类/协议 → 描述(如
Class 0x08
→ "Mass Storage") -
HID 描述符、国家代码、语言ID等
-
-
-
硬件数据库查询
-
通过
libudev
的硬件数据库(hwdb)获取最新设备信息 -
支持通过 modalias 模式匹配(如
usb:v0781p5581*
)
-
names的修改
注释掉和udev相关接口。
configure的修改
注释掉udev libudev的检测
4758-4847 之间的全部删除掉。
usb-utils的配置编译
./configure \--host=aarch64-linux-gnu \--enable-static \--disable-udev \--disable-shared \--prefix=/opt/usbutils-aarch64-static \LIBUSB_CFLAGS="-I/opt/libusb-aarch64-static/include/libusb-1.0" \LIBUSB_LIBS="-L/opt/libusb-aarch64-static/lib -lusb-1.0" \CC=aarch64-linux-gnu-gcc \CFLAGS="-static " \LDFLAGS="-static -lpthread"
注意两个/opt/路径的设置,设置了编译usb-utils时需要的libusb的库文件和头文件。
至此,我们可以正常make出lsusb的命令,仅仅是看不到设备的解释,用于查询是否设备是否存在等都可以正常使用。
file lsusb
lsusb: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=558daf18e6f482378496e70ca08d5bbb8ab1caa2, for GNU/Linux 3.7.0, with debug_info, not stripped
总结
相比较于前面i2cutils集成了依赖库源码,usb-utils并没有集成源码,导致交叉编译的工作量增加。同时依赖于libudev,而此库新版本集成到systemd中,导致编译异常麻烦。本文通过分析usb utils的功能,屏蔽掉不需要的部分。
另外一种方式就是找libudev已经编译好的二进制文件。