常用cmake命令記錄及Cmake指令碼模板(對付日常開發幾乎已經夠用了)
指令總結方面可以直接檢視這個官方連結:cmake.org/cmake/help/…
這裡總結一些常用的命令及使用示例:
-
set
-
set (<variable> <value>... [PARENT_SCOPE])
設定某個變數的值,作用域為當前函式或者當前資料夾,
[PARENT_SCOPE]
這個引數沒用過,參照官方文件可知似乎是將此變數設定在上一級作用域中(也就是父目錄或者呼叫函式)使用變數的方法:${}
-
-
file
-
file(WRITE <filename> <content>...)
將content寫入指定檔案,如果檔案不存在則建立檔案;如果檔案存在則覆蓋該檔案
示例:
file(WRITE src/hello.txt "hello world")
-
file(APPEND <filename> <content>...)
示例:
file(APPEND src/hello.txt "hello world 2")
將content以追加的形式寫入指定檔案
-
file(READ <filename> <variable> [OFFSET <offset>][LIMIT <max-in>] [HEX])
將
<filename>
檔案裡面的內容從偏移為<offset>
的地方最多讀取<max-in>
個內容,並放入<variable>
進行儲存,HEX選項為16進位制讀取。示例:
file(READ src/hello.txt context LIMIT 5)
-
file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [<globbing-expressions>...])
生成<globbing-expressions>
與之匹配的檔案列表並將其儲存到<variable>
。Globbing表示式與正規表示式類似,但更簡單。如果RELATIVE指定了flag,則結果將作為給定路徑的相對路徑返回。預設情況下列出GLOB目錄 - 如果LIST_DIRECTORIES設定為false,則在結果中省略目錄 。
示例:
file(GLOB utils_src_cc src/utils/*.cc)
-
-
find_library()
-
find_library (<VAR> name1 [path1 path2 ...])
此命令用於查詢庫。建立名為
<VAR>
的快取條目以儲存此命令的結果。如果找到庫,則結果儲存在變數中,除非清除變數,否則不會重複搜尋。如果找不到任何結果,結果將是<VAR>-NOTFOUND
,並在下次使用相同變數呼叫find_library
時再次嘗試搜尋。搜尋的庫的名稱由name1指定(值為庫的名稱,如libz.a
,則name
值為z
)。可以在PATHS引數之後指定其他搜尋位置。示例:
find_library( log-lib log)
-
-
add_library()
使用指定的原始檔將庫新增到專案中。
-
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
新增一個根據命令呼叫中列出的原始檔,構建名為
<name>
的庫目標。它<name>
對應於邏輯目標名稱,並且在專案中必須是全域性唯一的。構建的庫的實際檔名是基於本機平臺(例如lib.a or .lib)的約定構造的。示例:
add_library( ${PROJECT_NAME} SHARED ${src1} //可以配合file命令,但官方不建議這麼做,理由是cmake無法知曉有新的檔案加入 ${src2} ${src3} ) 複製程式碼
-
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL])
匯入名字為
<name>
的庫示例:
add_library(myz SHARED IMPORTED) add_library(myz SHARED IMPORTED) #設定庫檔案所在路徑 set_target_properties(myz PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libnative-static.a) 複製程式碼
-
-
target_link_libraries()
-
target_link_libraries( ... ... ...)
預設情況下,使用此簽名,庫依賴項是可傳遞的。當此目標連結到另一個目標時,連結到此目標的庫也將出現在另一個目標的連結行上。這個傳遞性的“連結介面”儲存在
INTERFACE_LINK_LIBRARIES
目標屬性,可以通過直接設定屬性來覆蓋。示例:
target_link_libraries(${PROJECT_NAME} ${log-lib} ${z-lib})
-
-
include_directories()
-
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
將給定目錄新增到編譯器用於搜尋包含檔案的目錄中。相對路徑被解釋為相對於當前源目錄。include目錄被新增到當前CMakeLists檔案的目錄屬性 INCLUDE_DIRECTORIES 之中。他們對當前CMakeLists檔案中INCLUDE_DIRECTORIES屬性中也加入了每個目標的目標屬性。目標屬性值是生成器使用的值。
示例:
include_directories( src/dir1 src/dir2 src/dir3 src/dir4 ) 複製程式碼
-
-
兩個Cmakelists.txt的例子:
-
第一個
cmake_minimum_required(VERSION 3.4.1) set(PROJECT_NAME AMLLOC) file(WRITE amlloc/hello.txt "asdasda") file(READ amlloc/hello.txt context LIMIT 5) file(APPEND amlloc/hello.txt ${context}) file(GLOB amlloc_src amlloc/src/*.cpp) file(GLOB utils1_src_cc amlloc/src/utils/*.cc) file(GLOB utils2_src amlloc/src/utils2/*.cpp) file(GLOB utils3_src_cc amlloc/src/utils3/*/*.cc) file(GLOB utils3_src_c amlloc/src/utils4/*/*.c) file(GLOB utils4_src amlloc/src/utils5/*.c) find_library( log-lib log) find_library( z-lib z) include_directories( amlloc/src/utils/include amlloc/src/include amlloc/src/utils1 amlloc/src/utils2/md5 amlloc/src/utils2 amlloc/src/utils3 ) add_library( ${PROJECT_NAME} SHARED ${amlloc_src} ${utils1_src_cc} ${utils2_src} ${utils3_src_cc} ${utils3_src_c} ${utils4_src} ) target_link_libraries(${PROJECT_NAME} ${log-lib} ${z-lib}) 複製程式碼
-
第二個
首先看Project的目錄結構
├── CMakeLists.txt ├── main.cpp └── module ├── CMakeLists.txt ├── GameSave.h ├── s_utils.cc ├── s_utils.h ├── log.cc ├── log.h ├── utils.cc └── utils.h 複製程式碼
子目錄:
set(PROJECT_NAME module_demo) file(GLOB module_src ./*.cc) add_library(${PROJECT_NAME} SHARED ${module_src}) find_library(log-lib log) target_link_libraries(${PROJECT_NAME} ${log-lib}) 複製程式碼
父目錄:
cmake_minimum_required(VERSION 3.4.1) #find library log and the result is stored #in the var log-lib find_library(log-lib log) #get the .so directory set(DISTRIBUTION_DIR ${CMAKE_SOURCE_DIR}/../../../libs) add_library(gamesavesaty_module SHARED IMPORTED) set_target_properties(gamesavesaty_module PROPERTIES IMPORTED_LOCATION ${DISTRIBUTION_DIR}/armeabi/libmodule.so ) add_library(gamesavety SHARED IMPORTED) set_target_properties(gamesavety PROPERTIES IMPORTED_LOCATION ${DISTRIBUTION_DIR}/armeabi/libgamesavety.so ) #set c++ compiler set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(PROJECT_NAME demo) #include the module header file include_directories(./module) #add source file in module add_subdirectory(module) #Adds a library target called PROJECT_NAME to be built #from the source file main.cpp and files in module. add_library(${PROJECT_NAME} SHARED main.cpp) include_directories(${DISTRIBUTION_DIR}/armeabi) #Specify libraries module_demo and log-lib to #use when linking project demo. target_link_libraries(${PROJECT_NAME} module_demo gamesavety gamesavesaty_module ${log-lib}) 複製程式碼
-