cmake內置參數以及常用命令

這裏有個寫的非常好的cmake入門教程!!!

cmake中有很多已經定義好的默認變量,要知道其代表什麼並且可以使用它們。這裏假設我們的項目路徑在/project中,而編譯後文件的存放位置爲/project/build。

PROJECT_SOURCE_DIR 當前項目的路徑,即爲/project
PROJECT_BINARY_DIR 項目編譯後存放的路徑/project/build
CMAKE_CURRENT_BINARY_DIR 與PROJECT_BINARY_DIR基本相同
CMAKE_CURRENT_SOURCE_DIR 與PROJECT_SOURCE_DIR基本相同
CMAKE_POSITION_INDEPENDENT_CODE 設置爲ON時,告訴編譯器生成與路徑無關代碼。常用在動態庫中使用
CMAKE_CXX_FLAGS 指C++編譯器。可以通過修改它選擇C++編譯的參數
CMAKE_C_FLAGS 指C編譯器。可以通過修改它選擇C編譯的參數
LIBRARY_OUTPUT_PATH 生成的庫文件路徑

一個案例:

# 大小寫不嚴格區分
# cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.0.0)
 
# set():用來顯式的定義變量 
set(CMAKE_POSITION_INDEPENDENT_CODE ON)                 # 添加-fPIC編譯,即:裝成一個動態庫(Linux爲.so擴展文件;windows爲.dll擴展文件)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") # CMAKE_CXX_FLAGS:設置 C++ 編譯選項。帶-Wall和-Wextra進行編譯(作用是提示錯誤或警告)
set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda)              # 定義cuda路徑變量
 
# project name,指定項目的名稱,一般和項目的文件夾名稱對應
project(smart)
add_definitions(-std=c++11)                             # 添加支持c++11特徵
 
 
# find_package(CUDA)
find_package(OpenCV REQUIRED)                           # 它找到OpenCV程序庫之後,就會幫助我們預定義幾個變量,OpenCV_FOUND、OpenCV_INCLUDE_DIRS、OpenCV_LIBRARY_DIRS、OpenCV_LIBRARIES,
                                                        # 它們分別指是否找到OpenCV,OpenCV的頭文件目錄,OpenCV的庫文件目錄,OpenCV的所有庫文件列表

if (NOT OpenCV_FOUND)
    message(FATAL_ERROR "opencv not found")
endif (NOT OpenCV_FOUND)
 
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
 
 
add_subdirectory(src)                                   # 指定的文件夾加到build任務列表中
命令語法:project(<projectname> [languageName1 languageName2 … ] )

命令簡述:用於指定項目的名稱

使用範例:project(Main)
命令語法:cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]][FATAL_ERROR])

命令簡述:用於指定需要的 CMake 的最低版本

使用範例:cmake_minimum_required(VERSION 2.8)
命令語法:aux_source_directory(<dir> <variable>)

命令簡述:用於將 dir 目錄下的所有源文件的名字保存在變量 variable 中

使用範例:aux_source_directory(. DIR_SRCS)
命令語法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)

命令簡述:用於指定從一組源文件 source1 source2 … sourceN 編譯出一個可執行文件且命名爲 name

使用範例:add_executable(Main ${DIR_SRCS})
命令語法:add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)

命令簡述:用於指定從一組源文件 source1 source2 … sourceN 編譯出一個庫文件且命名爲 name

使用範例:add_library(Lib ${DIR_SRCS})
命令語法:add_dependencies(target-name depend-target1 depend-target2 …)

命令簡述:用於指定某個目標(可執行文件或者庫文件)依賴於其他的目標。這裏的目標必須是 add_executable、add_library、add_custom_target 命令創建的目標
命令語法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

命令簡述:用於添加一個需要進行構建的子目錄

使用範例:add_subdirectory(Lib)
命令語法:set(<variable> <value> [[CACHE <type><docstring> [FORCE]] | PARENT_SCOPE])

命令簡述:用於設定變量 variable 的值爲 value。如果指定了 CACHE 變量將被放入 Cache(緩存)中。

使用範例:set(ProjectName Main)
命令語法:unset(<variable> [CACHE])

命令簡述:用於移除變量 variable。如果指定了 CACHE 變量將被從 Cache 中移除。

使用範例:unset(VAR CACHE)
命令語法:message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message todisplay”…)

命令簡述:用於輸出信息

使用範例:message(“Hello World”)
命令語法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

命令簡述:用於設定目錄,這些設定的目錄將被編譯器用來查找 include 文件

使用範例:include_directories(${PROJECT_SOURCE_DIR}/lib)
命令語法:find_path(<VAR> name1 [path1 path2 …])

命令簡述:用於查找包含文件 name1 的路徑,如果找到則將路徑保存在 VAR 中(此路徑爲一個絕對路徑),如果沒有找到則結果爲 <VAR>-NOTFOUND。
默認的情況下,VAR 會被保存在 Cache 中,這時候我們需要清除 VAR 纔可以進行下一次查詢(使用 unset 命令)。

使用範例:

find_path(LUA_INCLUDE_PATH lua.h${LUA_INCLUDE_FIND_PATH})

if(NOT LUA_INCLUDE_PATH)

   message(SEND_ERROR "Header file lua.h not found")

endif()
命令語法:find_library(<VAR> name1 [path1 path2 …])

命令簡述:用於查找庫文件 name1 的路徑,如果找到則將路徑保存在 VAR 中(此路徑爲一個絕對路徑),如果沒有找到則結果爲 <VAR>-NOTFOUND。
命令語法:add_definitions(-DFOO -DBAR …)

命令簡述:用於添加編譯器命令行標誌(選項),通常的情況下我們使用其來添加預處理器定義

使用範例:add_definitions(-D_UNICODE -DUNICODE)
file:文件操作命令

1..................
file(GLOB variable [RELATIVE path] [globbingexpressions]...)
    GLOB 會產生一個由所有匹配globbing表達式的文件組成的列表,並將其保存到變量中。Globbing 表達式與正則表達式類似,但更簡單。
如果指定了RELATIVE 標記,返回的結果將是與指定的路徑相對的路徑構成的列表。(通常不推薦使用GLOB命令來從源碼樹中收集源文件列表。
原因是:如果CMakeLists.txt文件沒有改變,即便在該源碼樹中添加或刪除文件,產生的構建系統也不會知道何時該要求CMake重新產生構建文件)
globbing表達式包括:
    *.cxx- match all files with extension cxx
    *.vt? - match all files with extension vta,...,vtz
    f[3-5].txt - match files f3.txt,f4.txt, f5.txt

2..................
file(WRITE filename "message towrite"... )
    WRITE 將一則信息寫入文件’filename’中,如果該文件存在,它會覆蓋它,如果不存在,它會創建該文件。

3..................
file(APPEND filename "message to write"... )
    APPEND 如同WRITE,區別在於它將信息內容追加到文件末尾。

4..................
file(READ filename variable [LIMIT numBytes] [OFFSEToffset] [HEX])
    READ 會讀取文件的內容並將其存入到變量中。它會在給定的偏移量處開始讀取最多numBytes個字節。如果指定了HEX參數,
二進制數據將會被轉換成十進制表示形式並存儲到變量中。

 

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