CMake命令

1.aux_source_directory

#查找當前目錄所有源文件,並將源文件名稱列表保存到DIR_SRCS變量 (不能查找子目錄)
aux_source_directory(. DIR_SRCS)

2.添加一個庫或預編譯庫

#添加一個庫,名爲<name>。指定STATIC,SHARED,MODULE參數來指定庫的類型。STATIC:靜態庫;SHARED:動態庫,
#MODULE:在使用dyld的系統有效,若不支持dyld,等同於SHARED。EXCLUDE_FROM_ALL:表示該庫不會被默認構建。
#source1 source2 ... srouceN:用來指定庫的源文件
add_library(<name> [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

#添加一個已存在的預編譯庫,名爲<name>。一般配合set_target_properties使用
add_library(<name> <SHARED|STATIC|MODULE|UNKNOW> IMPORTED)
例子:
add_library(test SHARED IMPORTED)
set_target_properties(
	test #指明目標庫名
	PROPERTIES IMPROTED_LICATION #指明要設置的參數
	庫路徑/${ANDROID_ABI}/libtest.so # 導入庫的路徑
)

3.set命令

#設置可執行文件的輸出路徑(EXCUTABLE_OUTPUT_PATH是全局變量)
set(EXECUTABLE_OUTPUT_PATH [output_path])

#設置庫文件的輸出路徑(LIBRARY_OUTPUT_PATH是全局變量)
set(LIBRARY_OUTPUT_PATH [output_path])

#設置C++編譯參數(CMAKE_CXX_FLAGS是全局變量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")

#設置源文件集合(SOURCE_FILES是本地變量即自定義變量)
set(SOURCE_FILES main.cpp test.cpp ...)

4.設置頭文件目錄

#可以用相對路徑或絕對路徑 也可以用自定義的變量值
include_directories(./include ${MY_INDLUDE})
相當於g++選項中的-I參數

5.添加可執行文件

add_executable(<name> ${SRC_LIST})

6.將若干庫鏈接到目標庫文件

target_link_libraries(<name> lib1 lib2 lib3)

#如果出現互相依賴的靜態庫,CMake會允許依賴圖中包含循環依賴 如:
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)

#鏈接的順序應當符合gcc鏈接順序規則,被鏈接的庫放在依賴它的庫後面,即如果上面的命令中,lib1依賴於lib2,
lib2又依賴於lib3,則在上面命令中必須嚴格按照lib1lib2lib3的順序排列,否則會報錯

7.添加編譯參數 add_definitions

#爲當前路徑以及子目錄的源文件加入-D引入的define flag
add_definitions(-DF00 -DDEBUG ...)

8.指定子目錄的CMake源文件

#sub_dir指定包含CMakelists.txt和源文件的子目錄位置
#binary_dir是輸出路徑,一般可以不指定
add_subdirectory(sub_dir [binary_dir])

如果當前目錄下還有子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakelists.txt

9.file命令
在這裏插入圖片描述
10.設置某個路徑的一種屬性

set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
#設置某個路徑的一種屬性
#prop1, prop2代表屬性,取值爲:INCLUDE_DIRECTORIES LINK_DIRECTORIES INCLUDE_REGULAR_EXPRESSION ADDITIONAL_MAKE_CLEAN_FILES

11.在給定的作用域內設置一個命名的屬性

set_property(<GLOBAL | DIRECTORY [dir] | TARGET [target ...] | SOURCE [src1 ... ] | TEST [test1 ... ] | 
	CACHE [entry1 ...]> [APPEND] PROPERTY <name> [value ..])
#PROPERTY參數是必須的
#第一個參數決定了屬性可以影響的作用域:
	GLOBAL:全局作用域
	DIRECTORY:默認當前路徑,也可以用[dir]指定路徑
	TARGET:目標作用域,可以是0個或多個已有目標
	SOURCE:源文件作用域,可以是0個或多個源文件
	TEST: 測試作用域,可以是0個或多個已有的測試
	CACHE:必須指定0個或多個cache中已有的條目

案例1:多個源文件處理

如果源文件很多,把所有文件一個個加入很麻煩,可以使用aux_source_directory命令或者file命令,會查找指定目錄
下的所有源文件,然後將結果存進指定變變量名

#查找當前目錄所有源文件,並將名稱保存到DIR_SRCS變量 不能查找子目錄
aux_source_directory(. DIR_SRCS)
#也可以使用
file(GLOB DIR_SRCS *.c *.cpp)
add_library(native-lib SHARED ${DIR_SRCS})

案例2:多目錄多源文件處理

主目錄中的CMakelists.txt中添加add_subdirectory(child)命令,指明本項目包含一個子項目child。並在
target_link_libraries指明本項目需要鏈接一個名爲child的庫
子目錄child中創建CMakelists.txt,這裏child編譯爲共享庫
aux_source_directory(. DIR_SRCS)
add_subdirectory(child)
add_library(native-lib SHARED ${DIR_SRCS})
target_link_libraries(native-lib child)

#child目錄下的CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)
add_library(child SHARED ${DIR_LIB_SRCS})

案例3:添加預編譯庫
Android6.0之前

假設本地項目引入了libimported-lib.so
# 使用IMPROTED標誌告知CMake只希望將庫導入到項目中,如果是靜態庫則將SHARED改爲STATIC
add_library(imported-lib SHARED IMPROTED)
set_target_properties(improted-lib PROPERTIES IMPORTED_LOCATION <路徑>/libimported-lib.so)
aux_source_directory(. DIR_SRCS)
add_library(native-lib SHARED ${DIR_SRCS})
target_link_libraries(native-lib imported-lib)

Android6.0 之後

# set命令定義一個變量
# CMAKE_C_FLAGS:c的參數,會傳遞給編譯器
# 如果是c++文件,需要用CMAKE_CXX_FLAGS
# -L 庫的查找路徑
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目錄]")

案例4:添加頭文件目錄

爲了確保CMake可以在編譯時定位頭文件,使用include_directories,相當於g++選項中的-I參數。
這樣就可以使用#include<xx.h>,否則需要使用#include “path/xx.h”

案例5:build.gradle配置
在這裏插入圖片描述

發佈了126 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章