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

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

相关文章:

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

目录 1. Ubuntu中编译 2. NDK环境配置 3. 编译 4. 安装 这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下: https://github.com/gentoo/eudev 相应的代码最好是在Ubuntu中先编译通过&#…...

JavaSE核心知识点02面向对象编程02-04(包和导入)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点02面向对象编程02-04&#…...

【Git】查看tag

文章目录 1. 查看当前提交是否有tag2. 查看最近的tag3. 查看所有tag 有时候需要基于某个tag拉分支,记录下怎么查看tag。 1. 查看当前提交是否有tag git tag --points-at HEAD该命令可直接检查当前提交(HEAD)是否关联了任何tag。 若当前提交…...

华为昇腾910B通过vllm部署InternVL3-8B教程

前言 本文主要借鉴:VLLM部署deepseek,结合自身进行整理 下载模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")环境配置 auto-dl上选择单卡…...

upload-labs靶场通关详解:第三关

一、分析源代码 代码注释如下&#xff1a; <?php // 初始化上传状态和消息变量 $is_upload false; $msg null;// 检查是否通过POST方式提交了表单 if (isset($_POST[submit])) {// 检查上传目录是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件扩展名列表…...

星光云720全景VR系统升级版,720全景,360全景,vr全景,720vr全景

星光云720全景VR系统升级版&#xff0c;720全景&#xff0c;360全景&#xff0c;vr全景&#xff0c;720vr全景 星光云全景系统 系统体验地址 https://720.ailemon.cc 星光云全景新版体验地址 全景系统功能简介 基础设置&#xff1a;作品信息&#xff0c;加载样式&#xff…...

第十六节:图像形态学操作-顶帽与黑帽变换

一、引言&#xff1a;形态学操作的视觉魔法 在数字图像处理领域&#xff0c;形态学操作犹如一柄精巧的解剖刀&#xff0c;能够精准地提取图像特征、消除噪声干扰&#xff0c;并增强关键细节。OpenCV作为计算机视觉的瑞士军刀&#xff0c;提供了一套完整的形态学处理工具。在掌…...

将 iconfont 图标转换成element-plus也能使用的图标组件

在做项目时发现&#xff0c;element-plus的图标组件&#xff0c;不能像文档示例中那样使用 iconfont 的图标。经过研究发现&#xff0c;element-plus的图标封装成了vue组件&#xff0c;组件内容是一个svg&#xff0c;然后以组件的方式引入和调用图标。根据这个思路&#xff0c;…...

大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners​

论文链接&#xff1a; Language Models are Unsupervised Multitask Learners 点评&#xff1a; GPT-2采用了与GPT-1类似的架构&#xff0c;将参数规模增加到了15亿&#xff0c;并使用大规模的网页数据集WebText 进行训练。正如GPT-2 的论文所述&#xff0c;它旨在通过无监督语…...

等保系列(三):等保测评的那些事

一、等保测评主要做什么 1、测评准备阶段 &#xff08;1&#xff09;确定测评对象与范围 明确被测系统的边界、功能模块、网络架构及承载的业务。 确认系统的安全保护等级&#xff08;如二级、三级&#xff09;。 &#xff08;2&#xff09;签订测评合同 选择具备资质的测…...

ABP vNext + EF Core 实战性能调优指南

ABP vNext EF Core 实战性能调优指南 &#x1f680; 目标 本文面向中大型 ABP vNext 项目&#xff0c;围绕查询性能、事务隔离、批量操作、缓存与诊断&#xff0c;系统性地给出优化策略和最佳实践&#xff0c;帮助读者快速定位性能瓶颈并落地改进。 &#x1f4d1; 目录 ABP vN…...

高品质办公楼成都国际数字影像产业园核心业务​

成都国际数字影像产业园的核心业务&#xff0c;围绕构建专业化的数字影像文创产业生态系统展开&#xff0c;旨在打造高品质、高效率的产业发展平台。 产业集群构建与生态运营 园区核心业务聚焦于吸引和培育数字影像及相关文创领域的企业&#xff0c;形成产业集聚效应。具体包…...

MindSpore框架学习项目-ResNet药物分类-构建模型

目录 2.构建模型 2.1定义模型类 2.1.1 基础块ResidualBlockBase ResidualBlockBase代码解析 2.1.2 瓶颈块ResidualBlock ResidualBlock代码解释 2.1.3 构建层 构建层代码说明 2.1.4 定义不同组合(block&#xff0c;layer_nums)的ResNet网络实现 ResNet组建类代码解析…...

【Spring Boot】Spring Boot + Thymeleaf搭建mvc项目

Spring Boot Thymeleaf搭建mvc项目 1. 创建Spring Boot项目2. 配置pom.xml3. 配置Thymeleaf4. 创建Controller5. 创建Thymeleaf页面6. 创建Main启动类7. 运行项目8. 测试结果扩展&#xff1a;添加静态资源 1. 创建Spring Boot项目 打开IntelliJ IDEA → New Project → 选择M…...

线程中常用的方法

知识点详细说明 Java线程的核心方法集中在Thread类和Object类中,以下是新增整合后的常用方法分类解析: 1. 线程生命周期控制 方法作用注意事项start()启动新线程,JVM调用run()方法多次调用会抛出IllegalThreadStateException(线程状态不可逆)。run()线程的任务逻辑直接调…...

学习spring boot-拦截器Interceptor,过滤器Filter

目录 拦截器Interceptor 过滤器Filter 关于过滤器的前置知识可以参考&#xff1a; 过滤器在springboot项目的应用 一&#xff0c;使用WebfilterServletComponentScan 注解 1 创建过滤器类实现Filter接口 2 在启动类中添加 ServletComponentScan 注解 二&#xff0c;创建…...

为啥大模型一般将kv进行缓存,而q不需要

1. 自回归生成的特点 大模型&#xff08;如 GPT 等&#xff09;在推理时通常采用自回归生成的方式&#xff1a; 模型逐个生成 token&#xff0c;每次生成一个新 token 时&#xff0c;需要重新计算注意力。在生成第 t 个 token 时&#xff0c;模型需要基于前 t-1 个已生成的 t…...

雷赛伺服L7-EC

1电子齿轮比&#xff1a; 电机圈脉冲1万 &#xff08;pa11的值 x 4倍频&#xff09; 2电机刚性&#xff1a; pa003 或者 0x2003 // 立即生效的 3LED显示&#xff1a; PA5.28 1 电机速度 4精度&#xff1a; PA14 //默认30&#xff0c;超过3圈er18…...

阅文集团C++面试题及参考答案

能否不使用锁保证多线程安全&#xff1f; 在多线程编程中&#xff0c;锁&#xff08;如互斥锁、信号量&#xff09;是实现线程同步的传统方式&#xff0c;但并非唯一方式。不使用锁保证多线程安全的核心思路是避免共享状态、使用原子操作或采用线程本地存储。以下从几个方面详…...

AVL树:保持平衡的高效二叉搜索树

目录 一、AVL树的概念 1. 二叉搜索树的局限性 2. AVL树的定义 二、AVL树节点结构 三、AVL树的插入操作 1. 插入流程 2. 代码实现片段 四、AVL树的旋转调整 1. 左单旋&#xff08;RR型&#xff09; 2. 右单旋&#xff08;LL型&#xff09; 3. 左右双旋&#xff08;LR型…...

打造专属AI好友:小智AI聊天机器人详解

打造专属AI好友&#xff1a;小智AI聊天机器人详解 在当下的科技热潮中&#xff0c;AI正迅速改变着我们的生活&#xff0c;成为了科技领域的新宠。而今&#xff0c;借助开源项目的力量&#xff0c;你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…...

Webpack基本用法学习总结

Webpack 基本使用核心概念处理样式资源步骤&#xff1a; 处理图片资源修改图片输出文件目录 自动清空上次打包的内容EslintBabel处理HTML资源搭建开发服务器生产模式提取css文件为单独文件问题&#xff1a; Css压缩HTML压缩 小结1高级SourceMap开发模式生产模式 HMROneOfInclud…...

阿里云服务器数据库故障排查指南?

阿里云服务器数据库故障排查指南? 以下是针对阿里云服务器&#xff08;如ECS自建数据库或阿里云RDS等托管数据库&#xff09;的故障排查指南&#xff0c;涵盖常见问题的定位与解决方案&#xff1a; 一、数据库连接失败 检查网络连通性 ECS自建数据库 确认安全组规则放行数据库…...

数图闪耀2025深圳CCFA中国零售博览会:AI+零售数字化解决方案引发现场热潮

展会时间&#xff1a;2025年5月8日—10日 地点&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; 【深圳讯】5月8日&#xff0c;亚洲规模最大的零售行业盛会——2025 CCFA中国零售博览会在深圳盛大开幕。本届展会汇聚全球25个国家和地区的900余家参展商&#xff…...

Vue2 中 el-dialog 封装组件属性不生效的深度解析(附 $attrs、inheritAttrs 原理)

Vue2 中 el-dialog 封装组件属性不生效的深度解析&#xff08;附 $attrs、inheritAttrs 原理&#xff09; 在使用 Vue2 和 Element UI 进行组件封装时&#xff0c;我们常会遇到父组件传入的属性不生效的情况&#xff0c;比如在封装的 el-dialog 组件中传入 width"100%&qu…...

LeetCode 1722. 执行交换操作后的最小汉明距离 题解

示例&#xff1a; 输入&#xff1a;source [1,2,3,4], target [2,1,4,5], allowedSwaps [[0,1],[2,3]] 输出&#xff1a;1 解释&#xff1a;source 可以按下述方式转换&#xff1a; - 交换下标 0 和 1 指向的元素&#xff1a;source [2,1,3,4] - 交换下标 2 和 3 指向的元…...

linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程

目录 一、gdb跟踪被调试程序的fork、pthread_create操作 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; …...

游戏:用python写梦幻西游脚本(谢苏)

《梦幻西游》是一款受欢迎的网络游戏&#xff0c;许多玩家希望通过脚本来增强游戏体验&#xff0c;比如自动打怪、自动治疗等。本文将为您展示一个用Python编写简单《梦幻西游》自动打怪脚本的方案。 需求分析 1.1 具体问题 在《梦幻西游》中&#xff0c;玩家需要频繁与怪物进行…...

MLX-Audio:高效音频合成的新时代利器

MLX-Audio&#xff1a;高效音频合成的新时代利器 现代社会的快节奏生活中&#xff0c;对语音技术的需求越来越高。无论是个性化语音助手&#xff0c;还是内容创作者所需的高效音频生成工具&#xff0c;语音技术都发挥着不可或缺的作用。今天&#xff0c;我们将介绍一个创新的开…...

Spring Boot 3.x集成SaToken使用swagger3+knife4j 4.X生成接口文档

说一说Spring Boot 3.X集成SaToken使用swagger3并使用第三方的knife4j踩过的坑&#xff0c;废话不多说直接上正题&#xff0c;SaToken的我就不贴了 第一步当然是要先导入相关的依赖&#xff0c;包括swagger和knife4j&#xff0c;如下 <dependency><groupId>com.gi…...