CMake日常配置使用
概述
最近在搞一個C/C++的庫,以前編譯都會通過makefile來組織庫和代碼之前的依賴關係,對於簡單點的依賴,寫起來還好,但項目編譯的變得複雜的時候,寫起來就比較累了,所以就換成Cmake的編譯方式去實現這個功能,你會發現事情變得簡單了。 CMake是一種跨平臺編譯工具,比make更爲高級,使用起來要方便得多。CMake主要是編寫CMakeLists.txt文件,然後用cmake命令將CMakeLists.txt文件轉化爲make所需要的makefile文件,簡單點說就是cmake命令會根據CMakeLists.txt的配置來生成make命令所需要makefile文件。
接下來我會把CMakeLists.txt日常使用的配置記錄下來,命令不區分大小寫,變量區分大小寫,對於以下內容如理解有不對的地方請指出。
設置CMake命令運行的最低版本
cmake_minimum_required(VERSION 2.8)
當前最新版本爲3.14
設置項目名稱
project(CMake_Demo)
set命令給對應的變量賦值
//賦值
set(VAR "abc")
//訪問變量
VAR = ${VAR}
使用語法 ${Name} 來訪問名字爲 Name 的變量的值。在字符串中也可以使用 ${Name} 來訪問變量的值
unset移除變量
unset(VAR)
用於在執行CMake命令時,打印執行信息
message 打印信息
message ("VAR = ${VAR}")
用於在執行CMake命令時,打印執行信息
條件控制和循環結構
set(RELEASE TRUE)
if(RELEASE)
message("RELEASE = ${VAR}")
else()
message("DEBUG = ${VAR}")
endif()
對於 if(string) 來說:
如果 string 爲(不區分大小寫)1、ON、YES、TRUE、Y、非 0 的數則表示真
如果 string 爲(不區分大小寫)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 結尾的字符串則表示假
如果 string 不符合上面兩種情況,則 string 被認爲是一個變量的名字。變量的值爲第二條所述的各值則表示假,否則表示真。
此策略(Policy)在 CMake2.8.0 才被引入
find_package命令
find_package(Threads REQUIRED)
find_package可以根據cmake內置的.cmake的腳本去找相應的庫的模塊,這樣子就可以使用linux內置的多進程庫了
include命令
include(file1 [OPTIONAL])
include(module [OPTIONAL])
//編譯引入的第三方庫,具體請看ExternalProject_Add命令
include(ExternalProject)
可以指定載入一個文件,如果定義的是一個模塊,那麼將在CMAKE_MODULE_PATH中搜索這個模塊並載入。
include_directories
//"include_directories"用來指定build時需要的頭文件路徑
//"PROJECT_BINARY_DIR"是內置變量,表示工程編譯的目錄,也就是--prefix指定的目錄
include_directories("${PROJECT_BINARY_DIR}" "${include_dir}")
aux_source_directory命令
aux_source_directory(. DIR_SRCS)
用於將 dir 目錄下的所有源文件的名字保存在變量 DIR_SRCS中
add_executable命令
add_executable(demo ${COMMON_SRCS} ${SRCS})
用於指定從一組源文件 COMMON_SRCS SRCS … sourceN 編譯出一個可執行文件且命名爲 demo
add_library命令
add_library(demo ${COMMON_SRCS} ${SRCS})
用於指定從一組源文件 COMMON_SRCS SRCS … sourceN 編譯出一個庫文件且命名爲 demo
add_dependencies命令
add_dependencies(demo depend-target1 depend-target2)
用於指定某個目標(可執行文件或者庫文件)依賴於其他的目標。這裏的目標必須是 add_executable、add_library、add_custom_target 命令創建的目標
target_link_libraries命令
target_link_libraries(demo SHARED item1 item2...)
用於指定 demo需要鏈接item1 item2…。這裏 demo必須已經被創建,鏈接的 item 可以是已經存在的 target(依賴關係會自動添加) demo
C 編譯標誌相關變量
CMAKE_C_FLAGS
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
C++ 編譯標誌相關變量
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_C_FLAGS 或CMAKE_CXX_FLAGS 可以指定編譯標誌
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]或 CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO] 則指定特定構建類型的編譯標誌,這些編譯標誌將被加入到 CMAKE_C_FLAGS 或 CMAKE_CXX_FLAGS 中去,例如,如果構建類型爲 DEBUG,那麼 CMAKE_CXX_FLAGS_DEBUG 將被加入到 CMAKE_CXX_FLAGS中去
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLOG_DEBUG -g")
ExternalProject_Add引用第三方庫
set(createSqliteManifestScript "${CMAKE_CURRENT_SOURCE_DIR}/prepare_sqlite.sh")
ExternalProject_Add(libsqlite
PREFIX "${CMAKE_BINARY_DIR}/deps"
GIT_REPOSITORY "https://github.com/mackyle/sqlite"
#GIT_REPOSITORY "$ENV{HOME}/dev/github/sqlite"
GIT_TAG "version-3.26.0"
CONFIGURE_COMMAND ${createSqliteManifestScript} && ./configure
BUILD_IN_SOURCE 1
BUILD_COMMAND make
INSTALL_COMMAND ""
TEST_COMMAND ""
UPDATE_COMMAND ""
GIT_SHALLOW 1
GIT_PROGRESS 1
)
ExternalProject_Get_Property(libsqlite SOURCE_DIR)
set(SQLITE3_INCLUDE_DIR ${SOURCE_DIR})
set(SQLITE3_LIBRARY_DIR ${SOURCE_DIR}/.libs)
add_library(sqlite IMPORTED STATIC GLOBAL)
add_dependencies(sqlite libsqlite)
set_target_properties(sqlite PROPERTIES IMPORTED_LOCATION "${SQLITE3_LIBRARY_DIR}/libsqlite3.a")
最後鏈接的時候執行以下命令,就可以把sqlite加入到demo庫中
target_link_libraries(demo sqlite)
總結
有更多的命令就沒有時間去羅列出來了,如果平時自己需要用到哪個命令,大家最好上去官網查看更多用法