提取安卓NDK中的交叉编译器

参考国内镜像网站文档:使用独立工具链:https://developer.android.google.cn/ndk/guides/standalone_toolchain?hl=zh

大体步骤如下:

1. 调用ndk-bundle/build/tools/make_standalone_toolchain.py,生成一个压缩包。

2. 写一个批处理文件:设置一些环境变量,以后每次编译,直接双击打开,命令行下跟Linux shell一样编译。

先看第一步,调用make_standalone_toolchain.py会从一些目录里拷贝头文件、库,以及可执行文件。

下图是Windows版NDK下各个API版本各种体系结构的库文件路径,仅仅给大家一个感性认识,具体的、其他的,请各位看官到自己的安装目录下查看。

其中,调用make_standalone_toolchain.py需要指定几个参数:

--arch,指定CPU体系结构,不是64位的ARM,不用管arm v5 v7,直接写arm就行,64位arm写arm64,默认是GCC。你也可以使用 --toolchain=<toolchain> 选项指定其他的编译器。

工具链
arm
  • --toolchain=arm-linux-androideabi-4.8
  • --toolchain=arm-linux-androideabi-4.9
  • --toolchain=arm-linux-android-clang3.5
  • --toolchain=arm-linux-android-clang3.6
x86
  • --toolchain=x86-linux-android-4.8
  • --toolchain=x86-linux-android-4.9
  • --toolchain=x86-linux-android-clang3.5
  • --toolchain=x86-linux-android-clang3.6
arm64
  • --toolchain=aarch64-linux-android-4.9
  • --toolchain=aarch64-linux-android-clang3.5
  • --toolchain=aarch64-linux-android-clang3.6
x86_64
  • --toolchain=x86_64-linux-android-4.9
  • --toolchain=x86_64-linux-android-clang3.5
  • --toolchain=x86_64-linux-android-clang3.6

--api,指定NDK版本。

重点说说使用STL:

--stl=gnustl,使用GNU的STL:

原始头文件:

库文件:

--stl=stlport,使用stlport的STL:

原始头文件:

库文件:

--stl=libc++,使用LLVM的STL:

原始头文件:

库文件:

注意,如果你调用make_standalone_toolchain.py导出standalone toolchains时指定了某个toolchain,某个STL,那么以后在使用toolchains编译的时候,请使用定义好的编译工具集(gcc或clang)和STL库,否则会出很多编译报错(当然你可以手工去从NDK中拷贝各种所缺的头文件、库来解决这个问题)。

 

其次说说写一个bat批处理文件。

首先了解一些背景知识:除了编译器(gcc, clang等),还需要制定一系列的binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。

 

好了,新建一个bat文件,把下面的内容拷贝进去:

1. 修改你的armcc指向。

2. 我的toolchain是clang,所以我的g++和gcc,以及CC和CXX指向的都是clang,你要修改成你自己的类型。

@echo off

set toolchain=D:\bin\android18_arm32
set path=%toolchain%\bin;%path%

@doskey g++=arm-linux-androideabi-clang++ -fPIE -fPIC -pie -static-libstdc++ $*
@doskey gcc=arm-linux-androideabi-clang -fPIE -fPIC -pie -static-libstdc++ $*
@doskey ld=arm-linux-androideabi-ld $*
@doskey ar=arm-linux-androideabi-ar $*
@doskey as=arm-linux-androideabi-as $*
@doskey readelf=arm-linux-androideabi-readelf $*
@doskey strip=arm-linux-androideabi-strip $*
@doskey c++filt=arm-linux-androideabi-c++filt $*
@doskey nm=arm-linux-androideabi-nm $*

set CC=arm-linux-androideabi-clang -fPIE -fPIC -pie
set CXX=arm-linux-androideabi-clang++ -fPIE -fPIC -pie -static-libstdc++
set AR=arm-linux-androideabi-as
set LD=arm-linux-androideabi-ld
set READELF=arm-linux-androideabi-readelf
set STRIP=arm-linux-androideabi-strip

cmd.exe
pause

 

 

 

为了方便使用,我从NDK中提取出了一个api=21(Android 5.0),stl=gnustl,32位arm-v7a的编译器:

提取命令如下:

make_standalone_toolchain.py --stl gnustl --api 21 --arch arm

提取出来后的压缩包(下载地址:https://download.csdn.net/download/lizhengx/10616381),我添加了一个“编译控制台.bat”,解压后需要修改下面的toolchain变量的值,修改为解压后的路径。

@echo off

set toolchain=D:\bin\armcc\api21-arm32
set path=%toolchain%\bin;%path%

@doskey g++=arm-linux-androideabi-g++ -fPIE -fPIC -pie -static-libstdc++ $*
@doskey gcc=arm-linux-androideabi-gcc -fPIE -fPIC -pie -static-libstdc++ $*
@doskey ld=arm-linux-androideabi-ld $*
@doskey ar=arm-linux-androideabi-ar $*
@doskey as=arm-linux-androideabi-as $*
@doskey readelf=arm-linux-androideabi-readelf $*
@doskey strip=arm-linux-androideabi-strip $*
@doskey c++filt=arm-linux-androideabi-c++filt $*
@doskey nm=arm-linux-androideabi-nm $*

set CXX=arm-linux-androideabi-g++ -fPIE -fPIC -pie -static-libstdc++
set CC=arm-linux-androideabi-gcc -fPIE -fPIC -pie
set AR=arm-linux-androideabi-as
set LD=arm-linux-androideabi-ld
set READELF=arm-linux-androideabi-readelf
set STRIP=arm-linux-androideabi-strip

cmd.exe
pause

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值