天天看点

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

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

版本说明

版本 作者 日期 备注
0.1 loon 2020.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号之后:

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

所以应该下载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/下:

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

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安装成功并配置环境变量成功:
           
android-ndk-r10交叉编译libev(ubuntu16.04)

同理,在/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-r10交叉编译libev(ubuntu16.04)
android-ndk-r10交叉编译libev(ubuntu16.04)
android-ndk-r10交叉编译libev(ubuntu16.04)

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
           
android-ndk-r10交叉编译libev(ubuntu16.04)
(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
           

安装完成后内容如下:

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

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

export PATH=/home/zy/android-18-toolchain/arm-linux-androideabi/bin:$PATH
           
android-ndk-r10交叉编译libev(ubuntu16.04)

接着重新生效source ~/.bashrc

之后重新运行./configure

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

最终成功了:

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

然后执行make:

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

在当前目录的./libs下面可以找到编译成功的libev库:

android-ndk-r10交叉编译libev(ubuntu16.04)
(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)系的三方库时应该也是类似的。