当前位置: 首页 > 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

相关文章:

  • RoPE长度外推:外插内插
  • Microsoft 365 Copilot:为Teams在线会议带来多语言语音交流新体验
  • 内存安全革命:工具、AI 与政策驱动的 C 语言转型之路
  • Mac配置php开发环境(多PHP版本,安装Redis)
  • MYSQL库表设计:范式
  • Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
  • [Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释
  • 【AI提示词】蝴蝶效应专家
  • 编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法
  • JWT原理及工作流程详解
  • 图像匹配导航定位技术 第 10 章
  • 单片机-STM32部分:10、串口UART
  • 虚拟文件系统
  • Rust 中的 Pin 和 Unpin:内存安全与异步编程的守护者
  • VS Code配置指南:打造高效的QMK开发环境
  • 操作系统的初步了解
  • YOLOv8目标检测性能优化:损失函数改进的深度剖析
  • STM32外设-串口UART
  • WORD压缩两个免费方法
  • leetcode - 双指针问题
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 洲际酒店:今年第一季度全球酒店平均客房收入同比增长3.3%
  • 第32届梅花奖终评启幕,上海京剧院《智取威虎山》满堂彩
  • 中华人民共和国和俄罗斯联邦关于全球战略稳定的联合声明
  • 公募基金解读“一揽子金融政策”:增量财政空间或打开,有助于维持A股活力