Cmake學習筆記

語法c++

CMakeLists.txt 的語法比較簡單,由命令、註釋和空格組成,其中命令是不區分大小寫的,可是變量是區分的。
符號 # 後面的內容被認爲是註釋。
命令由命令名稱、小括號和參數組成,參數之間使用空格進行間隔。數組

最簡單的CMakeLists.txt能夠只有三行:
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.6)
# 該命令表示項目的名稱是 Tutorial
project (Tutorial)
# 將名爲 tutorial.cc 的源文件編譯成一個名稱爲 Tutorial 的可執行文件
add_executable(Tutorial tutorial.cxx)ide

添加版本號
首先修改頂層 CMakeLists 文件,在 project 命令以後加入以下兩行
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)函數

分別指定當前的項目的主版本號和副版本號。
以後,爲了在代碼中獲取版本信息,咱們能夠修改 TutorialConfig.h.in 文件,添加兩個預約義變量
// the configured options and settings for Tutorial
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@測試


在CmakeList.txt 中添加如下代碼:
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
include_directories("${PROJECT_BINARY_DIR}")ui

再在代碼中包含 TutorialConfig.h頭文件,這樣就能夠使用版本號的宏了。debug

生成庫文件
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
注:默認是STATIC,code

多個目錄,多個源文件orm

使用命令 add_subdirectory 指明本項目包含一個子目錄, 該目錄下必須有CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS),查找當前目錄下的全部源文件,並將名稱保存到
DIR_LIB_SRCS 變量
使用命令 target_link_libraries 指明可執行文件 main 須要鏈接一個連接庫get

自定義編譯選項

CMake 容許爲項目增長編譯選項,從而能夠根據用戶的環境和需求選擇最合適的編譯方案。

# should we use our own math functions?
option (USE_MYMATH
"Use tutorial provided math implementation" ON)

# add the MathFunctions library?
#
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

在configured 中添加如下代碼:
#cmakedefine USE_MYMATH

安裝

install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

CMake變量

常常配合set命令使用的CMake變量,使用set(variable value)進行設置。
CMAKE_VERBOSE_MAKEFILE on 輸出詳細的編譯和連接信息
CMAKE_CXX_COMPILER "g++" c++編譯器
CMAKE_CXX_FLAGS "-Wall" c++編譯器參數
CMAKE_CXX_FLAGS_DEBUG 除CMAKE_CXX_FLAGS外,debug版本的額外編譯器參數
CMAKE_CXX_FLAGS_RELEASE 除CMAKE_CXX_FLAGS外,release版本的額外編譯器參數
EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin 可執行文件的輸出目錄
LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib 連接庫的輸出目錄

添加 CheckFunctionExists 宏

首先在頂層 CMakeLists 文件中添加 CheckFunctionExists.cmake 宏,並調用 check_function_exists 命令測試連接器是否可以在連接階段找到 pow 函數。

# 檢查系統是否支持 pow 函數
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)
將上面這段代碼放在 configure_file 命令前。

接下來修改 config.h.in 文件,預約義相關的宏變量。
// does the platform provide pow function?
#cmakedefine HAVE_POW

添加生成的源文件

add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS])

參考連接:https://www.hahack.com/codes/cmake/https://cmake.org/cmake-tutorial/

相關文章
相關標籤/搜索