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)

總結

有更多的命令就沒有時間去羅列出來了,如果平時自己需要用到哪個命令,大家最好上去官網查看更多用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章