Android提供的NDK工具链是基于GCC 4.4.3的,很多最新的GCC的优化特性无法使用,于是尝试自己编译一个。下面描述下具体过程。

获取需要的文件

按照下面的列表下载相同版本的源码,只要到它们的官方网站就可以找到

NDKr7

binutils 2.21.1

GCC 4.6.2

GDB 7.3.1

GMP 5.0.2

MPC 0.9

MPFR 3.0.1

当然可以选择尝试不同的版本组合,但可能会有各种错误,浪费宝贵的时间,比如下面这个错误我就困扰了很久

/bin/sed: can't read =/tmp/ndk-abitno/build/toolchain/temp-install/lib/libgmp.la: No such file or directory

libtool: link: `=/tmp/ndk-abitno/build/toolchain/temp-install/lib/libgmp.la' is not a valid libtool

组织源码目录

首先解压NDKr7,假定解压的NDK根目录为$NDK,然后其他软件源码的组织如下

$NDK/src/binutils/binutils-2.21.1/

$NDK/src/gcc/gcc-4.6.2/

$NDK/src/gdb/gdb-7.3.1/

$NDK/src/gmp/gmp-5.0.2.tar.bz2

$NDK/src/mpc/mpc-0.9.tar.gz

$NDK/src/mpfr/mpfr-3.0.1.tar.bz2

同时需要把一份build脚本代码放到$NDK/src/

git clone https://android.googlesource.com/toolchain/build.git $NDK/src/build

patch一部分代码

对$NDK/build/tools/build-gcc.sh做如下修改

MPFR_VERSION=$DEFAULT_MPFR_VERSION

register_var_option "--mpfr-version=" MPFR_VERSION "Specify mpfr version"

MPC_VERSION=0.9

register_var_option "--mpc-version=" MPC_VERSION "Specify mpc version"

--with-gcc-version=$GCC_VERSION \

--with-gdb-version=$GDB_VERSION \

--with-mpc-version=$MPC_VERSION \

--with-pic \

$ABI_CONFIGURE_EXTRA_FLAGS

然后对GCC打上两个补丁,一个从这个链接获取。另外一个是用来解决链接部分C++代码时出现的如下错误的

undefined reference to `__dso_handle'

补丁位于$NDK/build/tools/toolchain-patches/gcc/0005-Use-the-correct-CRT-files-with-shared-link-option.patch

开始编译

准备工作完成之后,编译就很顺畅了,不过要保证/tmp目录至少有2G的空间,如果没有,最好修改一下编译脚本中的路径。

$NDK/build/tools/build-gcc.sh --try-64  --gmp-version=5.0.2 --mpfr-version=3.0.1 --mpc-version=0.9 --binutils-version=2.21.1 --gdb-version=7.3.1 $(pwd)/src $(pwd) arm-linux-androideabi-4.6.2

编译完成后,$NDK/toolchains目录下会多出一个arm-linux-androideabi-4.6.2,然后把arm-linux-androideabi-4.4.3目录下的config.mk和setup.mk文件copy一份即可。

使用新的工具链

在你的NDK项目里,使用如下命令启用新的工具链

NDK_TOOLCHAIN=arm-linux-androideabi-4.6.2 ndk-build -j4

使用新的工具链的最终效果并没有很显著的性能提升,不过对于理解一些Android编译的相关过程还是挺有帮助的

(abitno)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐