Linux aarch64交叉编译之libusb库

Posted AGS_wangdsh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux aarch64交叉编译之libusb库相关的知识,希望对你有一定的参考价值。


对于libusb库 的交叉编译,该项目难度并不大,但也有一些坑点。该文章目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,会用一些技巧来绕过正常的交叉编译,你问我为啥?因为交叉编译的时候有难解的问题,不是不能解决,而是代价相对qemu代价显得略大。老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux Debian 板子上。

1 libusb简介

@1 why,为什么要搞一个libusb出来呢?

最开始的时候 是只有usb内核层的驱动的,但是随着 应用和linux 内核之间 兼容性的矛盾不断升级,慢慢衍生出了libusb这么个东西。接下来我们详细讲讲这是咋回事儿~。

当使用我们产品的客户有多个linux内核平台,有2.4的、2.6的、3.2的,4.9的,随着平台数量的增加,你的工作量线性的增加,而且最为蛋疼的是还有好多客户自定义的版本,每一次新环境,新平台你就增加一次工作量,天天不用干别的了,就编译吧。但这可不行,一个优秀的工程师怎么会把大把时间放在无意义的事情上呢,于是呢,就搞了libusb,以后大家都用这个,都兼容这个,这样就不用干那些没啥卵用的活儿了。就这样一个标准库诞生了。

@2 what,libusb是啥?

libusb是给应用软件开发和usb驱动协同操作(在底层读取usb内容)的功能时提供的库。它设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能相差不大,只是libusb更加接近USB规范。使得libusb的使用也比开发内核驱动相对容易的多。

@3 how,libusb怎么用?

直接在github上下载项目:​​GitHub - libusb/libusb library​

然后 跟着下面的步骤 编译后生成libusb的静态库和动态库,用户层库,根据需要使用即可。

2 Linux 本地编译 & 交叉编译

2.1 Linux(ubuntu20.04)上libusb的编译

首先确保环境没有问题,需要提前安装:

sudo apt install -y make dh-autoreconf libudev-dev

之后在libusb项目当前目录下执行:

./autogen.sh
./configure
make
make DESTDIR=$PWD/out_x86_64 install

 这样就编译完了。生成文件内容为:

└── usr
└── local
├── include
│ └── libusb-1.0
│ └── libusb.h
└── lib
├── libusb-1.0.a
├── libusb-1.0.la
├── libusb-1.0.so -> libusb-1.0.so.0.3.0
├── libusb-1.0.so.0 -> libusb-1.0.so.0.3.0
├── libusb-1.0.so.0.3.0
└── pkgconfig
└── libusb-1.0.pc

2.2 aarch64交叉编译与移植

交叉编译器aarch64走了一遍,不通的原因在于缺少 libudev的支持,而再搞一个aarch64版本的libudev库比较麻烦,还要再下载源码编译啥的,省点事儿,咱直接就上虚拟机,搞一个aarch64的虚拟机,流程如下:

#创建一个虚拟fs文件系统
$sudo qemu-debootstrap --arch arm64 bullseye /mnt/data/arm64 http://deb.debian.org/debian/
#进入到文件系统
$sudo chroot /mnt/data/arm64/
#退出文件系统
$exit

之后 执行 $sudo chroot /mnt/data/arm64/,进入到 虚拟机中,接下来执行和ubuntu PC端一样的流程,详细 如下所示:

./autogen.sh
./configure
make
make DESTDIR=$PWD/out_aarch64 install

 生成文件除了格式外和PC端都一样,搞定~~。

以上是关于Linux aarch64交叉编译之libusb库的主要内容,如果未能解决你的问题,请参考以下文章

Linux aarch64交叉编译之 cryptopp加密库

Linux aarch64交叉编译之 nodejs js运行时环境

aarch64-linux-gnu-g++ 交叉编译为 arm64 错误

ARM交叉编译PHP

Ubuntu arm 交叉编译 and snapcraft

交叉编译Opencv的教程——基于aarch64-linux-gnu的交叉编译器