CMake簡介:
? CMake
是一個跨平臺的構(gòu)建工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。能夠輸出各種各樣的makefile或者project文件兔毙。Cmake 并不直接建構(gòu)出最終的軟件柠辞,而是產(chǎn)生其他工具的腳本(如Makefile ),然后再依這個工具的構(gòu)建方式使用走触。
? CMake
是一個比make更高級的編譯配置工具晦譬,它可以根據(jù)不同平臺、不同的編譯器互广,生成相應(yīng)的Makefile或者vcproj項目蛔添。從而達(dá)到跨平臺的目的。Android Studio利用 CMake
生成的是ninja
兜辞,ninja
是一個小型的關(guān)注速度的構(gòu)建系統(tǒng)迎瞧。我們不需要關(guān)心ninja
的腳本,知道怎么配置cmake
就可以了逸吵。從而可以看出cmake
其實是一個跨平臺的支持產(chǎn)出各種不同的構(gòu)建腳本的一個工具凶硅。
CMake
的腳本名默認(rèn)是CMakeLists.txt
。
Cmake語法簡介:
1.CmakeList.txt
#cmake的最低版本
cmake_minimum_required(VERSION 3.6)
# ${ANDROID_ABI} 構(gòu)建的COU
# ${CMAKE_SOURCE_DIR} cmakeList.txt所在的文件夾路徑
# message("","") 相當(dāng)于log
# add_subdirectory(路徑) 引入路徑下的 cmakeList
# 源文件 最終生成的 so
add_library(變量名A SHARED B.c)
add_library(變量名A STATIC B.c)
# 源文件 最終生成的 so 多文件設(shè)置
file(GLOB 變量名SRCC src/main/cpp/*.c src/main/cpp/*.cpp)
add_library(變量名A SHARED ${SRCC})
# =========================添加依賴庫1=================================
# 設(shè)置靜態(tài)庫以導(dǎo)入的形式加入到項目中來
add_library(變量名B STATIC IMPORTED)
set_target_properties(變量名B PROPERTIES IMPORTED_LOCATION 路徑1/xx.a 路徑2/xxx.so)
# ========================= 添加依賴庫2 =================================
#設(shè)置動態(tài)依賴庫1
# 添加動態(tài)庫,為了android版本之間的兼容性扫皱,需要設(shè)置一個變量
# CMAKE_CXX_FLAGS c++的參數(shù) 會傳給編譯器
# CMAKE_C_FLAGS c的參數(shù) 會傳給編譯器
# 重新定義 CMAKE_CXX_FLAGS 變量的內(nèi)容 (如果是c文件足绅,需要用 CMAKE_C_FLAGS )
# CMAKE_SOURCE_DIR 當(dāng)前文件的地址
# ANDROID_ABI 當(dāng)前手機的ABI
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")
#設(shè)置動態(tài)依賴庫2 會從 ndk中的platforms/android-21/arch-arm/usr/lib/ 中查找log庫 并賦值給log_lib
find_library( log-lib log )
# 為了確保 CMake 可以在編譯時定位頭文件
# 這樣就可以使用 #include <xx.h> 引入
# 否則需要使用 #include "path/xx"
include_directories( imported-lib/include/ )
# 設(shè)置依賴的庫
# 如果是靜態(tài)庫,需要根據(jù) add_library中設(shè)置的變量名B去查找
# 如果是動態(tài)庫,需要根據(jù) CMAKE_CXX_FLAGS 改變后的路徑下去按照庫名查找
target_link_libraries( 要生成的庫A 依賴的庫B ${log-lib} )
2.build.gradle
android.defaultConfig.externalNativeBuild
externalNativeBuild {
cmake {arguments "-DANDROID_TOOLCHAIN=clang", //使用的編譯器clang/gcc
"-DANDROID_STL=gnustl_static"http://cmake默認(rèn)就是 gnustl_static
cFlags "" //這里也可以指定cflag和cxxflag,效果和之前的cmakelist里使用一樣
cppFlags ""
//指定需要編譯的cpu架構(gòu)
abiFilters "armeabi-v7a"
//指定需要編譯的模塊(如Cmake中配置了生成native-lib韩脑、native-lib2)
//默認(rèn)按照cmake的配置編譯所有
//這里指定只編譯 native-lib 模塊
targets "native-lib"
}
}
android.externalNativeBuild
externalNativeBuild {
cmake {
//指定腳本路徑 當(dāng)前build.gradle文件的相對路徑
path "xxx/CMakeLists.txt"
}
}