經常使用cmake命令記錄及Cmake腳本模板(對付平常開發幾乎已經夠用了)html
指令總結方面能夠直接查看這個官方連接:cmake.org/cmake/help/…c++
這裏總結一些經常使用的命令及使用示例:正則表達式
setexpress
set (<variable> <value>... [PARENT_SCOPE])
緩存
設置某個變量的值,做用域爲當前函數或者當前文件夾,[PARENT_SCOPE]
這個參數沒用過,參照官方文檔可知彷佛是將此變量設置在上一級做用域中(也就是父目錄或者調用函數)bash
使用變量的方法:${}函數
fileui
file(WRITE <filename> <content>...)
spa
將content寫入指定文件,若是文件不存在則建立文件;若是文件存在則覆蓋該文件c++11
示例: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})
複製代碼