CMakeList常用变量及规则查询笔记
文章目錄
- 1. 常用的變量及規(guī)則
- ① 預(yù)定義變量
- ② 系統(tǒng)信息
- ③ 主要開關(guān)選項(xiàng)
- ④ 環(huán)境變量
- ⑤ 常用規(guī)則
- 2. 項(xiàng)目組織結(jié)構(gòu)
- 3. 自定義搜索規(guī)則
- 4. 條件控制
- if…elseif…else…endif
- while…endwhile
- foreach…endforeach
- 5. 打印信息
- 6. 包含其他cmake文件
1. 常用的變量及規(guī)則
① 預(yù)定義變量
- PROJECT_NAME:項(xiàng)目名稱
- PROJECT_SOURCE_DIR:工程的根目錄
- PROJECT_BINARY_DIR :執(zhí)行cmake命令的目錄,通常是 ${PROJECT_SOURCE_DIR}/build
- CMAKE_CURRENT_SOURCE_DIR:當(dāng)前CMakeLists.txt文件所在目錄
- CMAKE_CURRENT_BINARY_DIR:target 編譯目錄
- CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路徑
- CMAKE_CURRENT_LIST_LINE:當(dāng)前所在的行
- CMAKE_INSTALL_PREFIX:工程安裝目錄,所有生成和調(diào)用所需的可執(zhí)行程序,庫(kù)文件,頭文件都會(huì)安裝到該路徑下,Unix/Linux下默認(rèn)為/usr/local,windows下默認(rèn)為C:\Program Files
- CMAKE_MODULE_PATH:設(shè)置搜索CMakeModules模塊(.cmake)的額外路徑,用來定義自己的 cmake 模塊所在的路徑,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令來調(diào)用自己的模塊
- CMAKE_C_FLAGS:設(shè)置C編譯選項(xiàng)
- CMAKE_CXX_FLAGS:設(shè)置C++編譯選項(xiàng)
- CMAKE_C_COMPILER:設(shè)置C編譯器
- CMAKE_CXX_COMPILER:設(shè)置C++編譯器
- CMAKE_BUILD_TYPE:build類型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug;
- CMAKE_COMMAND:也就是CMake可執(zhí)行文件本身的全路徑
- CMAKE_DEBUG_POSTFIX:Debug版本生成目標(biāo)的后綴,通常可以設(shè)置為"d"字符
- CMAKE_GENERATOR:編譯器名稱,例如”UnixMakefiles”, “Visual Studio 7”等
- BUILD_SHARED_LIBS:指定編譯成靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù)
- EXECUTABLE_OUTPUT_PATH:設(shè)置編譯后可執(zhí)行文件目錄
- LIBRARY_OUTPUT_PATH:設(shè)置生成的庫(kù)文件目錄
- CMAKE_INCLUDE_CURRENT_DIR:自動(dòng)添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當(dāng)前處理的CMakeLists.txt,set (CMAKE_INCLUDE_CURRENT_DIR ON)
② 系統(tǒng)信息
- CMAKE_MAJOR_VERSION:cmake 主版本號(hào),比如 3.4.1 中的 3
- CMAKE_MINOR_VERSION:cmake 次版本號(hào),比如 3.4.1 中的 4
- CMAKE_PATCH_VERSION:cmake 補(bǔ)丁等級(jí),比如 3.4.1 中的 1
- CMAKE_SYSTEM:系統(tǒng)名稱,比如 Linux-2.6.22
- CMAKE_SYSTEM_NAME:不包含版本的系統(tǒng)名,比如 Linux
- CMAKE_SYSTEM_VERSION:系統(tǒng)版本,比如 2.6.22
- CMAKE_SYSTEM_PROCESSOR:處理器名稱,比如 i686
- UNIX:在所有的類 UNIX 平臺(tái)下該值為 TRUE,包括 OS X 和 cygwin
- WIN32:在所有的 win32 平臺(tái)下該值為 TRUE,包括 cygwin
③ 主要開關(guān)選項(xiàng)
- BUILD_SHARED_LIBS:這個(gè)開關(guān)用來控制默認(rèn)的庫(kù)編譯方式,如果不進(jìn)行設(shè)置,使用 add_library 又沒有指定庫(kù)類型的情況下,默認(rèn)編譯生成的庫(kù)都是靜態(tài)庫(kù)。如果 set(BUILD_SHARED_LIBS ON)后,默認(rèn)生成的為動(dòng)態(tài)庫(kù)
- CMAKE_C_FLAGS:設(shè)置 C 編譯選項(xiàng),也可以通過指令 add_definitions() 添加
- CMAKE_CXX_FLAGS:設(shè)置 C++ 編譯選項(xiàng),也可以通過指令 add_definitions() 添加
④ 環(huán)境變量
# 使用環(huán)境變量$ENV{Name}# 寫入環(huán)境變量set(ENV{Name} value) # 這里沒有“$”符號(hào)⑤ 常用規(guī)則
-
cmake_minimum_required(VERSION 3.16) :指令cmake 版本
-
project(hello_world) :設(shè)置工程名
-
include_directories(${PROJECT_SOURCE_DIR}/include) :添加頭文件路徑
-
link_directories(${PROJECT_SOURCE_DIR}/lib) :添加鏈接庫(kù)的路徑
-
add_subdirectory(module):添加 module 子目錄, 此目錄下也要有CMakeLists.txt文件
-
add_executable(project1 main.c):指定編譯的可執(zhí)行文件
-
add_library(lib1 SHARED library.c library.h):指定生成的庫(kù)文件,SHARED為生成動(dòng)態(tài)庫(kù),STATIC為生成靜態(tài)庫(kù)
-
add_compile_options(): 添加編譯選項(xiàng),如add_compile_options(-std=c++11 -Wall)
-
target_link_libraries():將目標(biāo)文件與庫(kù)文件進(jìn)行鏈接
-
install():指定make install的目錄
-
set(XXXX YYYYYY):用于設(shè)置和修改變量,例如
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)set( SRC_LIST./main.c./testFunc1.c./testFunc.c)# 設(shè)置追加變量 set(SRC_LIST main.cpp) set(SRC_LIST ${SRC_LIST} test.cpp) add_executable(demo ${SRC_LIST}) -
${XXXX} :使用變量
-
list():追加或刪除變量的值
set(SRC_LIST main.cpp) list(APPEND SRC_LIST test.cpp) list(REMOVE_ITEM SRC_LIST main.cpp) add_executable(demo ${SRC_LIST}) -
find_library: 在指定目錄下查找指定庫(kù),并把庫(kù)的絕對(duì)路徑存放到變量里,其第一個(gè)參數(shù)是變量名稱,第二個(gè)參數(shù)是庫(kù)名稱,第三個(gè)參數(shù)是HINTS,第4個(gè)參數(shù)是路徑,其它用法可以參考cmake文檔,類似的還有 find_file()、find_path()、find_program()、find_package()等命令。
find_library(VAR lib_name path )
2. 項(xiàng)目組織結(jié)構(gòu)
- bin
- build
- include
- src
- lib
3. 自定義搜索規(guī)則
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp") add_library(demo ${SRC_LIST})#或者 file(GLOB SRC_LIST "*.cpp") file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp") add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})#或者 aux_source_directory(. SRC_LIST) aux_source_directory(protocol SRC_PROTOCOL_LIST) add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})4. 條件控制
if…elseif…else…endif
邏輯判斷和比較:
- if (expression):expression 不為空(0,N,NO,OFF,FALSE,NOTFOUND)時(shí)為真
- if (not exp):與上面相反
- if (var1 AND var2)
- if (var1 OR var2)
- if (COMMAND cmd):如果 cmd 確實(shí)是命令并可調(diào)用為真
- if (EXISTS dir) if (EXISTS file):如果目錄或文件存在為真
- if (file1 IS_NEWER_THAN file2):當(dāng) file1 比 file2 新,或 file1/file2 中有一個(gè)不存在時(shí)為真,文件名需使用全路徑
- if (IS_DIRECTORY dir):當(dāng) dir 是目錄時(shí)為真
- if (DEFINED var):如果變量被定義為真
- if (var MATCHES regex):給定的變量或者字符串能夠匹配正則表達(dá)式 regex 時(shí)為真,此處 var 可以用 var 名,也可以用 ${var}
- if (string MATCHES regex)
數(shù)字比較:
- if (variable LESS number):LESS 小于
- if (string LESS number)
- if (variable GREATER number):GREATER 大于
- if (string GREATER number)
- if (variable EQUAL number):EQUAL 等于
- if (string EQUAL number)
字母表順序比較:
- if (variable STRLESS string)
- if (string STRLESS string)
- if (variable STRGREATER string)
- if (string STRGREATER string)
- if (variable STREQUAL string)
- if (string STREQUAL string)
while…endwhile
while(condition)... endwhile()foreach…endforeach
foreach(loop_var RANGE start stop [step])... endforeach(loop_var)start 表示起始數(shù),stop 表示終止數(shù),step 表示步長(zhǎng),示例:
foreach(i RANGE 1 9 2)message(${i}) endforeach(i) #輸出:135795. 打印信息
message(${PROJECT_SOURCE_DIR}) message("build with debug mode") message(WARNING "this is warnning message") message(FATAL_ERROR "this build has many error") # FATAL_ERROR 會(huì)導(dǎo)致編譯失敗6. 包含其他cmake文件
include(./common.cmake) # 指定包含文件的全路徑 include(def) # 在搜索路徑中搜索def.cmake文件 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 設(shè)置include的搜索路徑#################################################################CMakeLists.txt cmake_minimum_required(VERSION 2.8) include (Project.txt)#Project.txt project (Project) add_executable(Project project.c)參考文獻(xiàn):
- https://www.jianshu.com/p/2b6cbf53ba95
- https://blog.csdn.net/afei__/article/details/81201039
- https://blog.csdn.net/whahu1989/article/details/82078563
- https://www.jb51.cc/c/110763.html
- blog.csdn.net/fengbingchun/article/details/46685413
總結(jié)
以上是生活随笔為你收集整理的CMakeList常用变量及规则查询笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mathematica视频处理实例-边缘
- 下一篇: HLW8112在电力监控系统中的应用