Libusb Udev 交叉编译
前言
交叉编译的版本是 libusb 的最新版本 1.0.21。
libusb-1.0.16 以上因支持 hotplog 依赖 udev,编译期间遇到了麻烦即 libudev。
网上搜后并没有解决方案,倒是很多 configure 时--enable-udev=no
,而我是需要这个功能的,只好自己来了。
libudev
libudev 并没有发布源码包,官方的 udev 是实现在systemd
下的。
只好从 debian 源里找,发现还真有已经编译好的 arm 库,选择armel
,下载。
关于什么是armel/armhf
,可以参考这篇文章。
下面的链接 download 下来解包:
https://packages.debian.org/wheezy-backports/armel/libudev1/download
解 dev 包的方法:
法1:
ar -vx xx.deb
tar -xzvf data.tar.gz
法2:
dpkg -x xx.dev /xx/xx
移植过程
交叉编译 configure 时,1 个习惯是在新 dir,而不是直接 configure,好处是编译更多平台而互不干扰。
mkdir build-sp
cd build-sp
touch configure-sp.sh
另外 1 个习惯是将编译依赖和编译后的库用相同目录存放,(用--prefix
指定,同时CFLAG
和LDFLAG
也指定为同一目录),当移植时,直接复制所有库即可。
configure 脚本如下:
#!/bin/sh
TOOLCHAIN_ROOT=/home/litecar/toolchain/fsl-linaro-toolchain
INSTALL_PREFIX=/home/install-prefix/sunplus
../configure \
--prefix=$INSTALL_PREFIX \
--host=arm-linux \
--enable-static=yes \
--enable-shared=no \
CC="$TOOLCHAIN_ROOT/bin/arm-none-linux-gnueabi-gcc -fPIC -march=armv7-a -marm -mthumb-interwork" \
CFLAGS="-I$INSTALL_PREFIX/include" \
LDFLAGS="-L$INSTALL_PREFIX/lib"
#CPPFLAGS="-I$INSTALL_PREFIX/include" \
/home/install-prefix/sp
下的库组织结构如下,这样 libusb 依据上面的脚本可以找到 libudev 的依赖路径
├── include
│ └── libudev.h
├── lib
│ ├── libudev.so -> libudev.so.1.3.5
│ └── libudev.so.1.3.5
一个大坑
在运行 configure libusb 时,提示错误找不到 libudev.查看 configure 文件可以知道其检查依赖库的原理,就是用 cross-compile gcc 去编译依赖库的最小代码,以检查依赖库是否工作。configure 报错并不提示为何依赖库不工作。
于是自己仿照 configure 编写简单的代码:
int udev_new();
int main(int argc, char* argv[])
{
return udev_new();
}
并直接 gcc 编译:
/home/litecar/toolchain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc -fPIC -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon main.c -o main -ludev -lc -L/home/install-prefix/sunplus/lib
终于找到原因是该版本的libudev1对应的libc>=2.17
,而 toolchain 依赖的 libc 版本才 2.13。
重新编译 glic 不太科学,于是回退找 libudev 的更低版本,还是发现有满足glibc>=2.13
的。
重下载编译之,done。
./configure_sp.sh
make
make install