1. 程式人生 > >clang(llvm)命令呼叫android NDK 編譯C應用

clang(llvm)命令呼叫android NDK 編譯C應用

在window下載的android NDK解壓後,可以用如下命令,安裝NDK獨立編譯工具。這樣再用命令時不用帶一把引數了。

"D:\Program Files\python27\python" make_standalone_toolchain.py --arch arm --api=9 --install-dir=d:/test --force

其中python27去下了安裝就好。

然後簡單的

D:\test\bin\arm-linux-androideabi-gcc -o test test.cpp 或

D:\test\bin\clang -o test test.cpp

都可以編出一個簡單的示例。我用的是clang 編出的好似用不支援arm6以下的。只能用於armv7以上。

如果需要支援arm6下以如以改寫bin目錄下的clang.cmd方件。

@echo off
if "%1" == "-cc1" goto :L
rem %~dp0\clang38.exe -target armv7a-none-linux-androideabi --sysroot %~dp0\..\sysroot %*
%~dp0\clang38.exe -target armv5te-none-linux-androideabi --sysroot %~dp0\..\sysroot %*
if ERRORLEVEL 1 exit /b 1
goto :done
:L
rem target/triple already spelled out.
%~dp0\clang38.exe %*
if ERRORLEVEL 1 exit /b 1
:done
 

又或者用帶引數呼叫

\clang38.exe -target armv5te-none-linux-androideabi --sysroot=D:\test\sysroot -o test test.cpp

相比如下的呼叫是簡單了一些,省了編譯器與庫的指定。

D:\android-ndk\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc --sysroot=D:\android-ndk\android-ndk-r13b\platforms\android-9\arch-arm -o test test.c 

如果是自已開發的新工程用這種主法編譯是一點問題也沒有的。但如果是已有工程,換android-ndk編譯,就要分多種情況了。

1,已有LINUX工程,GNU工具,可以編譯成arm-linux。這時改寫的主要問題就在於庫的不同。第三方編譯器CodeSourcery是個不錯的選擇,不過這個工具對最新的CPU支援不好,因為公司被收購了,新版的不公開原始碼了。這時,要麼改寫程式碼,要麼改寫CodeSourcery的原始碼使它支援新的arm指令集。兩種方法都要花去大量的時間。但是真的沒有比較好的選擇。

2,有一些程式碼一在編寫時就考慮了,android-linux. 又或者,有人修改原始碼,並公開了程式碼,這時方便多了。

3,最新的android studio考慮用的是LLVM工具鏈。用的是CMAKE。因為是傳統的.confige去配置編譯。雖然最的LLVM還是會去設用GCC,但make檔案不一樣,中間對原始碼的休改也是由CMAKE完成的。這時用CodeSourcery不能用了,cmake對它的支援不太好。這時有個CMAKE支援的開源工具codeblock這個我還沒用過,一會去試用一下。

試了這多多東西,我的主要目標,編譯一個可用的lldb-server 支援armv6的還沒實現,還沒看到方便實現的可能性。官方文件說android至少要是api21的但我不信。要用api9. 用CMAKE,ninja, ndk(clang,gcc)編譯了一下,報錯,沒法進行下去。主要的還是CMAKE的機制不太瞭解,不知道應去配什麼地方,並且對ninj和clang都不瞭解,也不知它們需要配成什麼樣。現在只是用cmake編譯小程式通過了,但對LLDB安官網給出的編譯配置引數通不過。先去了解一下以codeblock然後再說吧。