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,此文件的作用如下:

  1. USB 标识符到名称的转换

    • 将 USB 规范中的各种数字代码转换为可读字符串:

      • 厂商ID → 厂商名称(如 0x0781 → "SanDisk")

      • 产品ID → 产品名称(如 0x5581 → "Ultra Fit USB 3.0")

      • 设备类/子类/协议 → 描述(如 Class 0x08 → "Mass Storage")

      • HID 描述符、国家代码、语言ID等

  2. 硬件数据库查询

    • 通过 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已经编译好的二进制文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

proware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值