本篇為《網(wǎng)易云課堂》學習筆記
基礎語法
#設置參數(shù)
set(var djasklfjksfkdsjf)
#打印消息
message("var = ${var}")
#設置列表
set(list_var 1 2 3 4 5)
message("list_var: ${list_var}")
#while循環(huán)
set(a "")
while (NOT a STREQUAL "xxx")
set(a "${a}x")
message("a = ${a}")
endwhile ()
#列表遍歷
foreach (item 1 2 3)
message("item = ${item}")
endforeach (item)
#范圍遍歷
foreach (item RANGE 3)
message("item = ${item}")
endforeach (item)
#函數(shù)的使用(舉例為3個參數(shù))
fnction(func a b c)
message("a = ${a}")
message("b = $")
message("c = ${c}")
#參數(shù)個數(shù)
message("ARGC = ${ARGC}")
#參數(shù)列表
message("ARGC = ${ARGV}")
#第一個參數(shù)
message("ARGC = ${ARGV0}")
#第二個參數(shù)
message("ARGC = ${ARGV1}")
#第三個參數(shù)
message("ARGC = ${ARGV2}")endfunction(func)
func(1 2 3)
常用命令
cmake_miniumum_required cmake(VERSION 3.4.1)
- 指定cmake最低支持的版本,
- 命令可選,但是如果使用了高版本特有的命令就需要指定最低版本
aux_source_directory(. DIR_SRCS)
- 第一個參數(shù):查找目錄
- 第二個目錄:保存目錄的變量
- 查找當前目錄所有源文件,并將源文件名稱保存到 DIR_SRCS 便變量
- 不能查找子目錄
add_library
- 添加一個庫
* 添加庫文件,名稱為 <name>
* 指定庫類型:
(1)STATIC:靜態(tài)庫
(2)SHARED:動態(tài)庫
(3)MODULE:在dyld(蘋果的鏈接庫)有效,此環(huán)境為等效于 SHARED
* EXCLUDE_FROM_ALL:表示該庫不會默認構建
* source1 source2 ... sourceN:用來指定庫的源文件
add_library(
native-lib#添加的庫<name>
SHARE#指定的庫類型
native-lib.cpp#指定庫的源文件
)
- 導入預編譯庫
- 添加一個已經存在的預編譯庫 <name>
- 一般需要配合 set_target_properties 使用
add_library(
test
SHARED
IMPORTED#指定為導入的方式添加庫
)
set_target_properties(
test#指明目標庫名
PROPERTISE IMPORT_LOCATION#指明需要設置的參數(shù)
#ANDROID_ABI為Android二進制接口,適配不同cpu目錄
${庫路徑}/${ANDROID_ABI}/libtest.so#參數(shù)的值(此處為路徑)
)
-set
- 設置CMAK變量
# 設置 可執(zhí)行文件(全局變量:EXECUTABLE_OUTPUT_PATH) 的輸出路徑
set(EXECUTABLE_OUTPUT_PATH [output_path])
# 設置 庫文件(全局變量:LIBRARY_OUTPUT_PATH) 的輸出路徑
set(LIBRARY_OUTPUT_PATH [output_path])
#設置C++編譯參數(shù)(全局變量:CMAKE_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
# 設置源文件集合(SOURCE_FILES 為本地變量不用記憶,此處為展示)
set(SOURCE_FILES main.cpp test.cpp ...)
include_directories
- 設置頭文件目錄
- 相當于g++中的 -I 參數(shù)
#可以使用路徑和參數(shù)兩種形式
include_directories(./include ${MY_INCLUDE})
add_executable(<name> ${SRC_LIST})
- 定義了這個工程會生成一個文件名為<name>的可執(zhí)行文件,相關的源文件是SRC_LIST中定義的源文件列表
target_link_libraries(<name> lib1 lib2 lib3)
- <>為目標庫的名稱
- 將若干庫連接到目標庫文件
- 鏈接的順序需要按照 gcc 鏈接順序規(guī)則,被鏈接的庫放在依賴它的庫的后面
如標題:lib1依賴于lib2,lib2依賴于lib3,所以書寫順序為lib1 lib2 lib3
add_definitions(-DFOO -DDEBUG)
- 為當前目錄以及子目錄的源文件加入 -D引入的define flag
add_subdirectory
- 如果當前目錄包含子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakeLists.txt
# sub_dir 指定包含CMakeList.txt 和源碼的子文件目錄
#binary_dir 是輸出路徑,一般可以不指定
add_subdirectory(sub_dir [binary_dir])
file
- 文件操作指令
#將message寫入到filename文件中,會覆蓋文件原有內容
file(WRITE filename "message")
#將message寫入到filename文件中,會追加在文件末尾
file(APPEND filename "message")
#從filename文件中讀取內容存儲到 var 中
#[LIMIT numBytes] 為讀取的字節(jié)數(shù)上線
#[OFFSET offset] 為讀取開始位置
#[HEX] 指定內容以十六進制形式寫入 var
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
#重命名文件
file(RENAME <oldname> <newname>)
#刪除文件 等同于 rm
file(REMOVE [filel ...])
#遞歸的刪除文件 等同于 rm -r
file(REMOVE_RECURSE [filel ...])
# 根據(jù)指定 url 下載文件(輸入?yún)?shù))
# timeout 超時時間 (輸入?yún)?shù))
# status 用來保存下載狀態(tài) (保存輸出參數(shù))
# log 用來保存下載日志 (保存輸出參數(shù))
# md5 用來校驗,如果指定了 md5會自動進行校驗,不一致會返回一個錯誤(輸入?yún)?shù))
# SHOW_PEOGRESS 打印顯示進度信息(輸入?yún)?shù))
file(DOWNLOAD url file
[TIMEOUT timeout]
[STATUS status]
[LOG log]
[EXPECUTED_MD5 md]
[SHOW_PROGRESS])
#創(chuàng)建目錄
file(MAKE_DIRECTORY [dir1 dir2 ...])
#將 path 轉換為 unix 的風格,保存在 result
file(TO_CMAKE_PATH path result)
#將 path 轉換為 當前系統(tǒng) 的風格,保存在 result:window使用“\”;unix使用"/"
file(TO_NATIVE_PATH path result)
#將所有匹配查詢表達式 [globbing expression] 的文件生成一個list
# var 存儲查詢結果 list
# 指定[RELATIVE path] 則查詢結果為于 path 的相對路徑
file(GLOB var [RELATIVE path] [globbing expression]...)
set_directory_properties(PROPERTIES pro1 var1 pro2 var2)
- 設置某個路徑的一種屬性
- pro 指代屬性,var 為屬性的設置值
- pro可選值如下:
INCLUDE_DIRECTORIES
LINK_DIRECTORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEANFILES
set_propetry
- 在規(guī)定的作用域設置一個命名屬性
- PROGPERTY 是必須的
- 第一個參數(shù)為屬性影響范圍
GLOBAL :全局
DIRECTORY [dir...]:默認為當前目錄,也可以用[dir]指定
TARGET [target...] :指定作用域
SOUCES [src...] :指定源文件
TEST [test...] :指定測試作用域
CACHE [ent...] :指定cache中已有的條目
set_propertry(
<GLOBAL | TARGET [target...] | SOUCES [src...] | TEST [test...] | CACHE [ent...]>
[APPEND]
PEOPERTY
<name>
[value...]
)
注意事項匯總
添加預編譯庫(Android6.0之后)
上面使用add_library() + set_target_properties()的方式導入庫(詳見add_library)。
這個方式在Android6.0之后的使用會有問題,替換為一下方式
# 使用 -set 命令 修改 flag 變量,在變量后追加 -L+dir
# c文件使用 CMAKE_C_FLAGS c++文件使用CMAKE_CXX_FLAGS
# -L 為庫的查找命令
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目錄])