android-ndk-r10交叉编译libev(ubuntu16.04)

news/2024/11/17 1:31:20/

android-ndk-r10交叉编译libev(ubuntu16.04)


版本说明

版本作者日期备注
0.1loon2020.8.18初稿

目录

文章目录

    • android-ndk-r10交叉编译libev(ubuntu16.04)
    • 版本说明
    • 目录
      • 一、准备
        • 1、ndk下载
        • 2、libev下载
      • 二、ndk安装
        • 1、解压安装
        • 2、配置环境变量
        • 3、验证环境变量
      • 三、libev交叉编译
        • 1、编译前说明
        • 2、configure脚本执行时的常见错误及解决方法(重点)
          • (1)、提示检测c编译环境失败
          • (2)、使arm-linux-androideabi-gcc具备-v功能
          • (3)、使用make-standalone-toolchain.sh单独剥离toolchain
          • (4)、创建对应库的软链接
      • 四、最后

理论上可以通过一些集成环境比如AS、eclipse+ndk+adt等环境进行ndk编译,但是我们目前暂时不需要编译完整的Android工程,仅仅编译适用于Android下的so,所以这里直接通过单独的ndk进行交叉编译,这和其它交叉编译环境类似,但有一些新的坑点,只要解决这些坑点即可像其它交叉编译一样完成使用ndk进行的交叉编译。

一、准备

1、ndk下载

下载你需要的
Android-ndk-r10下载,这个是针对Android4.4.2版本的ndk。

在这里下载最新版以及旧版本,也可以找开发板提供商要适合其版本的kit。
https://developer.android.google.cn/ndk/downloads比如我这里有个r10版本的ndk:
链接:https://pan.baidu.com/s/1hlAwmfWuyZNIjQxCN6dF5A
提取码:kzig

2、libev下载

这里要注意libev的版本,libev支持Android编译通过GitHub查看似乎是在2018.4.19号之后:

在这里插入图片描述
在这里插入图片描述

所以应该下载4.25以上版本较为稳妥,我之前下载了4.23版本确实没有编译过,目前我使用的4.33版本:

链接:https://pan.baidu.com/s/1O43qkpyQF4qkHJu2UtLcdg
提取码:pwfx

官网地址需要翻墙:

http://dist.schmorp.de/libev/Attic/

二、ndk安装

之前安装过到/opt/目录下,这次安装到/usr/local/目录,这样可以多个用户使用。

1、解压安装

解压到/usr/local/下:

在这里插入图片描述

2、配置环境变量

暂时我们只设置本地用户环境变量:

打开~/.bashrc

vim ~/.bashrc,然后在末尾增加ndk的安装路径并添加到PATH中:

#set NDK env
export NDK_ROOT=/usr/local/android-ndk-r10
export PATH=${PATH}:$NDK_ROOT

3、验证环境变量

运行脚本使得环境变量生效
source ~/.bashrc
执行
ndk-build
来确认ndk安装成功并配置环境变量成功:

在这里插入图片描述

同理,在/etc/profile文件中添加上述内容后执行脚本使之生效。

三、libev交叉编译

1、编译前说明

libev的编译是autogen工具生成configure编译脚本系的编译方式,所以基本还是三步走:

./configure
make
make install

交叉编译时基本增加–host和CC指定交叉编译器即可。

2、configure脚本执行时的常见错误及解决方法(重点)

(1)、提示检测c编译环境失败

基本第一次执行编译时会提示:

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... /usr/local/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
checking whether the C compiler works... no
configure: error: in `/home/zy/libev':
configure: error: C compiler cannot create executables
See `config.log' for more details

截图如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Android的NDK自带了toolchain,但是不能直接使用NDK目录内的toolchain,否则会出现找不到crtbegin_dynamic.o文件。

即使用-L指定目录或者直接放到gcc命令行也还是提示该文件找不到。(暂时不清楚具体的原因,Android相关内容的基础原理还是没有好好研究过)

然后搜集了一些资料,这里有两种方法,我尝试了一种可以:

(2)、使arm-linux-androideabi-gcc具备-v功能

根据:http://blog.sina.com.cn/s/blog_e8d05a2e0102v32y.html

默认arm-linux-androideabi-gcc -v是获取不到交叉编译前的版本的们需要安装:

sudo apt-get install lsb-core

在这里插入图片描述

(3)、使用make-standalone-toolchain.sh单独剥离toolchain

根据:https://blog.csdn.net/u011784994/article/details/65445298?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

以及

https://blog.csdn.net/huozhihao/article/details/9194955

其实Android NDK提供了脚本来剥离出单独的toolchain,脚本的名字叫 make-standalone-toolchain.sh

我们执行这个脚本将该toolchain剥离安装到另一个位置:
(比如我这里安装到当前用户的根目录,不建议这么做,但是目前就我一个人用虚拟机,所以我暂时这么做了)

$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-18 --install-dir=/home/zy/android-18-toolchain

安装完成后内容如下:

在这里插入图片描述

接着我们将该路径加入到环境变量即可:

export PATH=/home/zy/android-18-toolchain/arm-linux-androideabi/bin:$PATH

在这里插入图片描述

接着重新生效source ~/.bashrc

之后重新运行./configure

CC=/home/zy/android-18-toolchain/bin/arm-linux-androideabi-gcc ./configure --host=arm-linux-androideabi

最终成功了:
在这里插入图片描述
在这里插入图片描述

然后执行make:
在这里插入图片描述

在当前目录的./libs下面可以找到编译成功的libev库:
在这里插入图片描述

(4)、创建对应库的软链接

在这里

https://blog.csdn.net/Sozell/article/details/8898646

也找到一种方案:

“这里看了Stack Overflow上的文章,貌似NDK的toolchain不会去指定的lib目录下找库文件,所以会报crtbegin_so.o和crtend_so.o找不到的问题。这个就用土办法解决,直接在当前目录下建立对应文件的软连接即可,如下:”

ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtbegin_so.o
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtend_so.o

这个方案我没有尝试,觉得上个方案更好一些,感兴趣的朋友也可以试试。

四、最后

总算是使用ndk顺利编译成功了,其中剥离出来toolchain这一步比较奇特,算是对ndk不了解的情况下遇到的一个比较棘手的坑,最终总算是爬出来了,感谢上述作者。

后续使用ndk编译其它configure(autogen)系的三方库时应该也是类似的。


http://www.ppmy.cn/news/182344.html

相关文章

假设每磁道划分成10个物理块,每块存放1个逻辑记录。逻辑记录R1,R2,…

一个经典的操作系统题目: 数据存储在磁盘上的排列方式会影响I/O服务的总时间。假设每磁道划分成10个物理块,每块存放1个逻辑记录。逻辑记录R1,R2,…,R10存放在同一个磁道上,记录的安排顺序如下表所示&…

服务器磁盘raid0,raid1,raid10,raid5,raid50,raid6,raid60 分析与案例

1,raid0的特性:采用剥离,数据将在几个磁盘上进行分割。数据被分成很多数据块,每一数据块会被写入不同的磁盘。从而,每一磁盘的工作负荷都得到了降低,这有助于加速数据传输。RAID-0可让磁盘更好地响应&#…

【Android】android ndk r10 环境配置

android sdk 更新到 r23 时,eclipse 自带 adt版,里面并没有设置ndk的路径,从而导致了在ndk配置方面的难度。本文主要适合: ① 使用 android sdk r23 20140702 的朋友 ② 使用 android ndk r10 的朋友 ③ 想知道andorid adt自带ecl…

一文看懂JDK12中新版垃圾回收器-Shenandoah GC

目录 1. 简介 2. 流程 3. 实现 3.1. GC 前 3.2. GC 疏散阶段(Concurrent Evacuation) 3.3. GC 更新引用阶段(Concurrent Update References) 3.4. GC更新引用阶段(Final Update Refs ) 4. 对象比较…

安装R语言(Rstudio、R、RTools)

安装R语言(Rstudio、R、RTools) 本文介绍一下从零搭建R环境。 那么R语言,RTools和Rstudio有什么区别? R是基本的编程语言,单纯使用R是可以的,如图: image-20221207112951762 为了编写R程序,单独…

R10 Wifi 模块

一个很好的Wifi 模块 本模块支持透传、支持配置、支持定制 1.产品简介 1.1 概述 随着智能手机普及和 AI 技术流行,物联网技术已经应用到各个领域,越来越多的设备 连接互联网、云端、大数据。在智能化趋势的今天,我们可以通过手机、语音来操…

ARM寄存器R0-R15别名

寄存器R0-R15别名 1.1基本名与别名 ARM寄存器 寄存器名字Reg#APCS意义R0a1工作寄存器R1a2"R2a3"R3a4"R4v1必须保护R5v2"R6v3"R7v4"R8v5"R9v6"R10sl栈限制R11fp桢指针R12ip内部过程调用寄存器R13sp栈指针R14lr连接寄存器R15pc程序计…

ARM-汇编指令集(总结)

ARM汇编指令集 指令、伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行。 (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生…