提取安卓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 |
|
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
@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