【cmake系列使用教程】linux
cmake使用教程(一)-起步android
cmake使用教程(四)-文件生成器github
cmake使用教程(六)-蛋疼的語法macos
cmake使用教程(八)-macro和functionbash
這個系列的文章翻譯自官方cmake教程:cmake tutorial。
示例程序地址:github.com/rangaofei/t…
不會僅僅停留在官方教程。本人做爲一個安卓開發者,實在是沒有linux c程序開發經驗,望大佬們海涵。教程是在macos下完成,大部分linux我也測試過,有特殊說明的我會標註出來。本教程基於cmake-3.10.2,同時認爲你已經安裝好cmake。
該文章未介紹如何編譯,能夠參考個人另外一篇文章
用cmake交叉編譯至關簡單,基本能夠達到一次編寫,每次都能運行的目的。
CMake使用toolchain來編譯,連接library和建立archives,以及其餘task來驅動構建。 可用的toolchain實用程序由啓用的語言肯定。 在正常版本中,CMake根據系統默認值自動肯定主使用的toolchain。 在交叉編譯場景中,可使用關於編譯器和實用程序路徑的信息來指定toolchain文件。
假如咱們已經編寫好了本身的toolchain文件,那麼在執行構建時添加參數-DCMAKE_TOOLCHAIN_FILE=path/to/file
便可,cmake系統會自動使用執行的toolchain.cmake文件。
安卓平臺交叉編譯有兩種方式,一是使用ndk編譯,另外一種是使用本身的工具鏈編譯,我感受我只會ndk編譯,另外一中我就不介紹了,由於我不會。
這裏介紹如何構建makefile和ninja兩種方式的交叉編譯。
有幾個特殊的變量須要設置:
CMAKE_SYSTEM_NAME
編譯安卓平臺時請設置這個變量爲Android
。並且CMAKE_SYSTEM_VERSION
必須指定。
CMAKE_SYSTEM_VERSION
設置安卓的api level,假如未設置這個值,則會由如下兩個方式決定:
CMAKE_ANDROID_API
設置了,則使用該api levelCMAKE_SYSROOT
設置了,則使用該api levelCMAKE_ANDROID_ARCH_ABI
arm64-v8a armeabi-v7a armeabi-v6 armeabi mips mips64 x86 x86_64
。 這個牛逼了,設置abi架構,假如未設置,則使用默認的armeabi
。設置了這個變量系統會自動設置CMAKE_ANDROID_ARCH
,沒必要手動設置。
CMAKE_ANDROID_NDK
這個更牛逼了,使用它來設置ndk的路徑,必須是絕對路徑,到ndk的根目錄便可。
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS
設置爲true,則會使用每一個api level中已經廢棄的頭文件,而不會使用統一的頭文件。默認爲false,使用統一的頭文件。
CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION
設置NDK編譯鏈的版本,假如不設置,則使用最新的。
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。
CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX
自動生成的,絕對路徑的前綴。
CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX
自動生成的,絕對路徑的後綴。
CMAKE_ANDROID_NDK
,就會使用該變量指定的NDK路徑CMAKE_ANDROID_STANDALONE_TOOLCHAIN
,而1中的變量未設置,就會使用該獨立的工具鏈編譯。CMAKE_SYSROOT
,一、2未設置,而且路徑形式是<ndk>/platforms/android-<api>/arch-<arch>
,則至關於設置了CMAKE_ANDROID_NDK
,而且會使用該路徑的ndk。CMAKE_SYSROOT
,一、二、3未設置,而且路徑形式是<standalone-toolchain>/sysroot
,則至關於設置了CMAKE_ANDROID_STANDALONE_TOOLCHAIN
而且使用該工具鏈編譯。ANDROID_NDK
,一、二、三、4未設置,則至關於設置了1,而且使用該ndk。ANDROID_STANDALONE_TOOLCHAIN
,一、二、三、四、5未設置,則至關於設置了2,而且使用該工具鏈。ANDROID_NDK_ROOT
或者ANDROID_NDK
,一、二、三、四、五、6則至關於設置了1,而且使用NDK。ANDROID_STANDALONE_TOOLCHAIN
,一、二、三、四、五、六、7未設置,則至關於設置了2,而且使用該工具鏈。通常須要設置的以下:
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
複製代碼
效果與上邊是同樣的。