当前位置: 首页 > news >正文

OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)

目录

1. Ubuntu中编译

2. NDK环境配置

3. 编译

4. 安装


这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下:

https://github.com/gentoo/eudev

相应的代码最好是在Ubuntu中先编译通过(即获取到x86版本的),以版本3.2.14为例。

1. Ubuntu中编译

如果需要在NDK中编译通过,最好现在Linux中编译通过。

  • 安装必要的工具,
sudo apt-get install autoconf automake libtool
  • 安装libusb1.0
sudo apt install libusb-1.0-0-dev
  • 执行autogen

autogen.sh将会检测当前系统是否满足源代码包依赖项和工具库,执行相应的检查和更新操作,并根据configure.ac文件中的配置,生成Makefile文件,以便后续编译、安装和部署。

./autogen.sh
  • 执行configure

configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。

这一步如果有错误必须要解决,不然后面编译会出错。

  • 执行make

一般linux发行版本内是没问题的。

2. NDK环境配置

首先需要下载NDK,NDK在r17c版本前是支持gcc,后面的都是clang,而第三方库很多都是Linux上的,使用gcc编译,所以原则上是优先下载r17c的版本。

复制autogen.sh,重命名为envsetup.sh

#!/bin/shexport ROOT=~/Project
export NDK=$ROOT/android-ndk-r17cexport TARGET=arm-linux-androideabi
export ARCH=arm
export HOST=$TARGET
export SYSROOT=$NDK/sysrootexport TOOLCHAIN=$NDK/toolchains/$TARGET-4.9/prebuilt/linux-x86_64
export API=26export CC=$TOOLCHAIN/bin/$TARGET-gcc
export CXX=$TOOLCHAIN/bin/$TARGET-g++
#export CPP="$TOOLCHAIN/bin/$TARGET-gcc -E"
export AR=$TOOLCHAIN/bin/$TARGET-ar
export AS=$CC
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-stripexport CFLAGS="--sysroot=$NDK/platforms/android-$API/arch-$ARCH \-D__ANDROID_API__=$API \-I$SYSROOT/usr/include \-I$SYSROOT/usr/include/$TARGET \-fPIC -Wno-attributes"
export CXXFLAGS=$CFLAGS
#export CPPFLAGS=$CFLAGS
export LDFLAGS="-pthread -lc -L\"$SYSROOT/usr/lib\""export PATH=$PATH:$TOOLCHAIN/bin/
  • TARGET : 主机的类型,可以参考下面的链接

将 NDK 与其他构建系统配合使用  |  Android NDK  |  Android Developers

可以进NDK目录android-ndk-r17c/toolchains内查看当前NDK支持的类型,例如:

这里有6个TARGET类型(即带版本4.9的那6个文件夹) ,根据硬件平台选择,Zero3的是arm-linux-androideabi

  • ARCH:目标CPU构架,例如在NDK目录中android-ndk-r17c/platforms/android-24可以查到支持的类型

  • HOST:用于指定交叉编译的宿主平台,这里与目标平台一致。
  • SYSROOT:设置系统根目录
  • TOOLCHAIN:指定工具链的路径,这里使用的是GCC 4.9版本,适用于Linux x86_64平台。
  • API:指定Android最小的API等级
  • CC:设置C编译器。
  • CXX:设置C++编译器。
  • AR:设置创建静态库的ar工具。
  • AS:设置汇编器
  • LD:设置链接器
  • RNDLIB:设置用于生成库索引的ranlib工具。
  • STRIP:设置用于剥离符号的strip工具。
  • CFLAGS:设置C编译器的标志
  • CXXFLAGS:设置C++编译器的标志

  • LDFLAGS:设置链接器的标志

3. 编译

以此执行:

./envsetup.sh
./autogen.sh --host $HSOT
./configure --host $HOST --target $TARGET --prefix $SYSROOT/usr/local
make

出现编译错误。

  • error: 'LINE_MAX' undeclared (first use in this function)

缺少LINE_MAX的定义,在src/shared/missing.h添加

#ifndef LINE_MAX
#define LINE_MAX 2048
#endif
  • error: 'program_invocation_short_name' undeclared (first use in this function)
     

在src/shared/missing.h添加

#ifndef program_invocation_short_name
#define program_invocation_short_name "depmod"
#endif
  • fatal error: selinux/selinux.h: No such file or directory

把selinux关掉

./configure --host $HOST --target $TARGET --disable-selinux --prefix $SYSROOT/usr/local
  • error: 'RLIMIT_NLIMITS' undeclared here (not in a function)

在src/shared/missing.h添加

#ifndef RLIMIT_NLIMITS
#define RLIMIT_NLIMITS 16
#endif
  • error: 'IPTOS_LOWCOST' undeclared here (not in a function)

在src/shared/missing.h添加

#ifndef IPTOS_LOWCOST
#define	IPTOS_LOWCOST		0x02
#endif
  • fatal error: blkid/blkid.h: No such file or directory

把blkid关掉

./configure --host $HOST --target $TARGET --disable-selinux --disable-blkid --prefix $SYSROOT/usr/local
  • error: undefined reference to 'get_current_dir_name'

在src/shared/missing.h添加

  • error: 'SG_FLAG_LUN_INHIBIT' undeclared (first use in this function)

在src/shared/missing.h添加

#ifndef SG_FLAG_LUN_INHIBIT
#define SG_FLAG_LUN_INHIBIT 2   /* default is to put device's lun into */
#endif
  • error: undefined reference to 'is_fido_security_token_desc'

运行make clean清一下

  • warning: implicit declaration of function '__bswap_16' [-Wimplicit-function-declaration]

将Ubuntu中的usr/include/byteswap.h拷贝到NDK的sysroot/usr/include中,将Ubuntu中的usr/include/bits/byteswap.h、types.h、wordsize.h、timesize.h、typesizes.h、time64.h拷贝到NDK的sysroot/usr/include/bits/中

然后在android-ndk-r17c/sysroot/usr/include/bits/byteswap.h中添加

# define __GNUC_PREREQ(maj, min)        1

4. 安装

在源代码external文件夹内新家一个文件夹libudev,将libudev.so拷贝到这个文件夹内,再新建Android.bp文件。

cc_prebuilt_library_shared {name: "libudev",//proprietary: true,//product_specific: true,target: {android_arm: {srcs: ["libudev.so"],},},strip: {none:true,},
}

在device/softwinner/apollo/apollo_p2.mk文件中添加

PRODUCT_PACKAGES += libudev.so
PRODUCT_PACKAGES += libusb.so
http://www.xdnf.cn/news/365221.html

相关文章:

  • 边界网关协议 - BGP【高级】
  • 蓝绿激光对潜通信介绍
  • 【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
  • 画家沈燕的山水实验:在传统皴法里植入时代密码
  • mysql性能提升方法大汇总
  • 【kafla扫盲】FROM GPT
  • 基于51单片机步进电机控制—9个等级
  • async/await 原理揭秘
  • Windows11下通过Docker安装Redis
  • USB学习【4】协议层数据格式
  • C++八股 —— 函数指针与指针函数
  • PPI-ID: 德克萨斯大学研究团队最新款蛋白-蛋白互作(PPI)预测工具上线
  • Ascend的aclgraph(一)aclgraph是什么?torchair又是怎么成图的?
  • 2025年 全新 AI 编程工具 Cursor 安装使用教程
  • 2025数维杯数学建模C题完整限量论文:清明时节雨纷纷,何处踏青不误春?
  • 空间复杂度** 与 **所需辅助空间**
  • 33、前台搜索功能怎么实现?
  • 基环树(模板) 2876. 有向图访问计数
  • Dp通用套路(闫式)
  • OPENSSL-1.1.1的使用及注意事项
  • Qt 无边框窗口,支持贴边分屏
  • 大某麦演唱会门票如何自动抢
  • 高尔夫基本知识及规则·棒球1号位
  • PHP8报:Unable to load dynamic library ‘zip.so’ 错误
  • Xterminal(或 X Terminal)通常指一类现代化的终端工具 工具介绍
  • 攻防演练 | 关于蓝队攻击研判的3大要点解读
  • 分治算法-leetcode148题
  • archlinux 详解系统层面
  • RISC-V AIA SPEC学习(五)
  • Springboot+Vue+Mybatis-plus-Maven-Mysql项目部署