1. 程式人生 > >提取安卓NDK中的交叉編譯器

提取安卓NDK中的交叉編譯器

大體步驟如下:

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
@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