参考国内镜像网站文档:使用独立工具链: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 |
|
x86 |
|
arm64 |
|
x86_64 |
|
--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