cmake使用教程(九)-關於安卓的交叉編譯

【cmake系列使用教程】linux

cmake使用教程(一)-起步android

cmake使用教程(二)-添加庫c++

cmake使用教程(三)-安裝、測試、系統自檢git

cmake使用教程(四)-文件生成器github

cmake使用教程(五)-cpack生成安裝包shell

cmake使用教程(六)-蛋疼的語法macos

cmake使用教程(七)-流程和循環api

cmake使用教程(八)-macro和functionbash

cmake使用教程(九)-關於安卓的交叉編譯架構

cmake使用教程(十)-關於file

這個系列的文章翻譯自官方cmake教程:cmake tutorial

示例程序地址:github.com/rangaofei/t…

不會僅僅停留在官方教程。本人做爲一個安卓開發者,實在是沒有linux c程序開發經驗,望大佬們海涵。教程是在macos下完成,大部分linux我也測試過,有特殊說明的我會標註出來。本教程基於cmake-3.10.2,同時認爲你已經安裝好cmake。

簡介

該文章未介紹如何編譯,能夠參考個人另外一篇文章

shell腳本生成安卓全abi動態庫與靜態庫

用cmake交叉編譯至關簡單,基本能夠達到一次編寫,每次都能運行的目的。

CMake使用toolchain來編譯,連接library和建立archives,以及其餘task來驅動構建。 可用的toolchain實用程序由啓用的語言肯定。 在正常版本中,CMake根據系統默認值自動肯定主使用的toolchain。 在交叉編譯場景中,可使用關於編譯器和實用程序路徑的信息來指定toolchain文件。

假如咱們已經編寫好了本身的toolchain文件,那麼在執行構建時添加參數-DCMAKE_TOOLCHAIN_FILE=path/to/file便可,cmake系統會自動使用執行的toolchain.cmake文件。

安卓平臺交叉編譯有兩種方式,一是使用ndk編譯,另外一種是使用本身的工具鏈編譯,我感受我只會ndk編譯,另外一中我就不介紹了,由於我不會。

這裏介紹如何構建makefile和ninja兩種方式的交叉編譯。

變量說明

有幾個特殊的變量須要設置:

  1. CMAKE_SYSTEM_NAME

    編譯安卓平臺時請設置這個變量爲Android。並且CMAKE_SYSTEM_VERSION必須指定。

  2. CMAKE_SYSTEM_VERSION

    設置安卓的api level,假如未設置這個值,則會由如下兩個方式決定:

    • CMAKE_ANDROID_API設置了,則使用該api level
    • CMAKE_SYSROOT設置了,則使用該api level
    • 都沒設置,則使用ndk中最新的api levele
  3. CMAKE_ANDROID_ARCH_ABI

    arm64-v8a armeabi-v7a armeabi-v6 armeabi mips mips64 x86 x86_64。 這個牛逼了,設置abi架構,假如未設置,則使用默認的armeabi。設置了這個變量系統會自動設置CMAKE_ANDROID_ARCH,沒必要手動設置。

  4. CMAKE_ANDROID_NDK

    這個更牛逼了,使用它來設置ndk的路徑,必須是絕對路徑,到ndk的根目錄便可。

  5. CMAKE_ANDROID_NDK_DEPRECATED_HEADERS

    設置爲true,則會使用每一個api level中已經廢棄的頭文件,而不會使用統一的頭文件。默認爲false,使用統一的頭文件。

  6. CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION

    設置NDK編譯鏈的版本,假如不設置,則使用最新的。

  7. CMAKE_ANDROID_STL_TYPE 這個牛逼了。有好幾個值:

    none No C++ Support

    system Minimal C++ without STL

    gabi++_static GAbi++ Static

    gabi++_shared GAbi++ Shared

    gnustl_static GNU libstdc++ Static

    gnustl_shared GNU libstdc++ Shared

    c++_static LLVM libc++ Static

    c++_shared LLVM libc++ Shared

    stlport_static STLport Static

    stlport_shared STLport Shared

    默認值是gnustl_static。

  8. CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

    自動生成的,絕對路徑的前綴。

  9. CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX 自動生成的,絕對路徑的後綴。

構建順序

  1. 假如設置了CMAKE_ANDROID_NDK,就會使用該變量指定的NDK路徑
  2. 假如設置了CMAKE_ANDROID_STANDALONE_TOOLCHAIN,而1中的變量未設置,就會使用該獨立的工具鏈編譯。
  3. 假如設置了CMAKE_SYSROOT,一、2未設置,而且路徑形式是<ndk>/platforms/android-<api>/arch-<arch>,則至關於設置了CMAKE_ANDROID_NDK,而且會使用該路徑的ndk。
  4. 假如設置了CMAKE_SYSROOT,一、二、3未設置,而且路徑形式是<standalone-toolchain>/sysroot,則至關於設置了CMAKE_ANDROID_STANDALONE_TOOLCHAIN而且使用該工具鏈編譯。
  5. 假如設置了ANDROID_NDK,一、二、三、4未設置,則至關於設置了1,而且使用該ndk。
  6. 假如設置了ANDROID_STANDALONE_TOOLCHAIN,一、二、三、四、5未設置,則至關於設置了2,而且使用該工具鏈。
  7. 假如設置了環境變量ANDROID_NDK_ROOT或者ANDROID_NDK,一、二、三、四、五、6則至關於設置了1,而且使用NDK。
  8. 假如設置了ANDROID_STANDALONE_TOOLCHAIN,一、二、三、四、五、六、7未設置,則至關於設置了2,而且使用該工具鏈。
  9. 全都沒設置會報錯。

編譯方式

通常須要設置的以下:

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21) # API level
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_ANDROID_NDK /path/to/android-ndk)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)
複製代碼

假如不想編寫toolchain.cmake文件,也課能夠在命令行直接輸入參數來完成構建:

cmake ../src \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=21 \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=/path/to/android-ndk \
  -DCMAKE_ANDROID_STL_TYPE=gnustl_static
複製代碼

效果與上邊是同樣的。

相關文章
相關標籤/搜索