什么是CMake
.在Android studio2.2及以上,構建原生庫的默認工具是CMake.
.CMake是一個跨平臺的構建工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程),能夠輸出各種各樣得makefile或者project文件,CMake并不是直接構建出最終的軟件,而是產生其他工具的腳本,比如makefile,然后再根據這個工具的構建方式使用。
.CMake是一個比make更高級的編譯配置工具,它可以根據不同的平臺,不同的編譯器,生成相應的makefile或者vcpro項目,從而達到跨平臺的目的,Android studio利用CMake生成的是ninja,? ? ninja是一個小型的關注速度的構建系統,我們不需要關心ninja的腳本,知道怎么配置CMake就行。
.CMake其實是一個跨平臺的支持產出各種不同的構建腳本的一個工具。
CMake源文件
1.可以包含空格,注釋,命令,換行
2.以CMake編寫的源文件,以CMakeLists.txt命名或以.cmake為拓展名
3.可以通過add_subdirectory()命令吧子目錄的CMake源文件加起來。
4.CMake源文件中所有有效的語句都是命令,可以是內置命令或自定義的函數/宏命令。
CMake注釋
#單行注釋
#[[多行注釋]]
CMake變量
CMake中所有的變量都是string類型,可以使用set()和unset()命令來聲明或者移除一個變量。
變量的引用:
${變量名}
#聲明變量 set(變量名 變量值) 如set(var 123)
#引用變量 var=${var}
CMake列表
列表也是字符串,可以把列表看作一個特殊的變量,這個變量有多個值。? ??
語法格式
set(列表名 值1 值2...值n)
或set(列表名"值1;值2;...值n")
列表的引用 ${列表名}
常用命令
cmake_minimum_required(VERSION 3.4.1)
指定最低需要版本
add_library()
添加一個庫或者導入一個預編譯庫
include_directories()
設置頭文件目錄,
target_link_libraries()
將若干庫鏈接到目標庫文件
多個源文件處理
查找當前目錄所有源文件,并將名稱保存到DIR_SRCS,
aux_source_directory(.DIR_SRCS)
add_library(
????????native-lib
????????SHARED
? ? ? ? ${DIR_SRCS})
也可以使用file命令
多目錄多源文件處理
主目錄中的CMakeLists.txt中添加add_subdirectory(child)命令,指明本項目包含一個子項目的child。并在targe_link_libraries指明本項目需要鏈接一個名為child的庫。子目錄child中創建CMakeLists.txt,這里child編譯為共享庫。
add_library(
? ? ? ? native-lib-parent
? ? ? ? SHARED
? ? ? ? native-lib.cpp)
add_subdirectory(child)//child必須為子目錄的名稱
find_library(
? ? ? ? log-lib
? ? ? ? log)
target_link_libraries(
? ? ? ? native-lib-parent
????????child
? ? ? ? ${log-lib})
#child目錄下
add_library(# Sets the name of the library.
? ? ? child
? ? ? ? # Sets the library as a shared library.
? ? ? ? SHARED
? ? ? ? # Provides a relative path to your source file(s).
? ? ? ? native-lib-child.cpp)
find_library(# Sets the name of the path variable.
? ? ? ? log-lib
? ? ? ? log)
鏈接第三方庫
將so庫復制到main下面jniLibs文件夾,
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-L${CMAKE_SOURCE_DIR}/../jniLib/${CMAKE_ANDROID_ARCH_ABI}")
target_link_libraries(# Specifies the target library.
fmod?#第三方庫名稱
fmodl?
# included in the NDK.
? ? ? ? ${log-lib})