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号之后:
所以应该下载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)系的三方库时应该也是类似的。