CMake常用数据类型

📅 2026/7/3 15:27:44
CMake常用数据类型
CMake常用数据类型一、字符串1、常用操作2、举例说明二、列表1、常用操作2、举例说明三、布尔值1、常用操作2、举例说明四、路劲1、常用操作2、举例说明类型类别实际存储形式用途说明常见操作命令/函数字符串String字符串单个值如路径、名称、标志等set(),string(), 比较STREQUAL列表List分号分隔的字符串如a;b;c多个值的集合常用于源文件、链接库等list(),foreach(),set()布尔值Boolean字符串ON/OFF或TRUE/FALSE控制开关、条件判断if(),option(),set(... CACHE BOOL)路径Path字符串但有路径语义文件或目录路径get_filename_component(),file(TO_CMAKE_PATH),find_path()一、字符串1、常用操作操作类别子命令 (Sub-command)语法格式说明计算/获取LENGTHstring(LENGTH string output_var)获取字符串长度字节数。SUBSTRINGstring(SUBSTRING string begin length output_var)提取子字符串。若 length 为 -1则提取到末尾注意中文。FINDstring(FIND string substring output_var [REVERSE])查找子串首次出现的位置索引。未找到返回 -1。REVERSE表示从后往前找。修改/替换REPLACEstring(REPLACE match_string replace_string output_var input...)将所有匹配的match_string替换为replace_string。支持多个输入字符串。REGEX REPLACEstring(REGEX REPLACE regex replace_expr output_var input...)使用正则表达式进行替换。replace_expr中可用\1,\2引用捕获组。APPENDstring(APPEND output_var input...)将后续字符串追加到变量末尾直接修改变量。PREPENDstring(PREPEND output_var input...)将后续字符串前置到变量开头直接修改变量。。大小写转换TOLOWERstring(TOLOWER string output_var)转换为小写。TOUPPERstring(TOUPPER string output_var)转换为大写。分割/连接JOINstring(JOIN glue output_var list...)CMake 3.12。用glue连接列表中的元素。REGEX MATCHALLstring(REGEX MATCHALL regex output_var input...)找出所有匹配正则的子串结果存入列表。其他CMP LESS/GREATER...string(COMPARE op str1 str2 output_var)比较两个字符串。op可以是LESS,GREATER,EQUAL,NOTEQUAL等。MD5/SHA1/SHA256string(HASH output_var input)计算字符串的哈希值。ASCII/HEXstring(ASCII number... output_var)string(HEX string output_var)ASCII码与字符互转字符串与十六进制互转。2、举例说明字符串比较常用操作符操作符 (Operator)含义适用命令说明STREQUAL相等if(),string(COMPARE EQUAL)严格字符串匹配区分大小写。STRLESS小于if(),string(COMPARE LESS)按字典序ASCII/Locale比较A B。STRGREATER大于if(),string(COMPARE GREATER)按字典序比较A B。STRLESS_EQUAL小于或等于if(),string(COMPARE LESS_EQUAL)A BSTRGREATER_EQUAL大于或等于if(),string(COMPARE GREATER_EQUAL)A BMATCHES正则匹配if()左侧字符串是否匹配右侧的正则表达式。IN_LIST列表包含if()CMake 3.3。检查字符串是否在列表中。set(USER_NAME张三123abc123)# 长度string(LENGTH${USER_NAME}len)message(STATUS长度(字节数):${len})# 子串注意中文string(SUBSTRING${USER_NAME}3-1SUB_NAME)message(STATUS子串:${SUB_NAME})# 查找string(FIND${USER_NAME}三 OUT_VAL)message(STATUS顺序查找:${OUT_VAL})string(FIND${USER_NAME}三 OUT_VAL REVERSE)message(STATUS倒序查找:${OUT_VAL})# 替换string(REPLACE a A OUT_VAL${USER_NAME})message(STATUS替换:${OUT_VAL})string(REPLACE 张三 李四 OUT_VAL${USER_NAME})message(STATUS替换:${OUT_VAL})# 正则替换string(REGEX REPLACE[0-9]OUT_VAL${USER_NAME})message(STATUS正则替换:${OUT_VAL})# 追加到末尾string(APPEND USER_NAME李四hello)message(STATUS追加到末尾:${USER_NAME})set(OUT_VAL)string(APPEND OUT_VAL${USER_NAME}王五world)message(STATUS追加到末尾:${OUT_VAL})# 追加到开头string(PREPEND USER_NAME测试)message(STATUS追加到开头:${USER_NAME})# 转小写string(TOLOWER${USER_NAME}lower_name)message(STATUS转小写:${lower_name})# 转大写string(TOUPPER${USER_NAME}upper_name)message(STATUS转大写:${upper_name})# 连接set(MY_LISTHelloWorld测试)set(OUT_VAL)string(JOIN OUT_VAL${MY_LIST})message(STATUSList连接成String(空格):${OUT_VAL})string(JOIN,OUT_VAL${MY_LIST})message(STATUSList连接成String(逗号):${OUT_VAL})# 查找子串存入Liststring(REGEX MATCHALL[0-9]VAR_LIST${USER_NAME})message(STATUS查找子串存入:${VAR_LIST})# 字符串比较string(COMPARE EQUAL${USER_NAME}测试OUT_VAL)message(STATUS比较操作EQUAL :${OUT_VAL})if(${USER_NAME}STREQUAL测试)message(STATUS操作符STREQUAL: TRUE)else()message(STATUS操作符STREQUAL: FALSE)endif()string(COMPARE LESS${USER_NAME}测试OUT_VAL)message(STATUS比较操作LESS :${OUT_VAL})if(${USER_NAME}STRLESS测试)message(STATUS操作符STRLESS: TRUE)else()message(STATUS操作符STRLESS: FALSE)endif()string(COMPARE GREATER${USER_NAME}测试OUT_VAL)message(STATUS比较操作GREATER :${OUT_VAL})if(${USER_NAME}STRGREATER测试)message(STATUS操作符STRGREATER: TRUE)else()message(STATUS操作符STRGREATER: FALSE)endif()string(COMPARE LESS_EQUAL${USER_NAME}测试OUT_VAL)message(STATUS比较操作LESS_EQUAL :${OUT_VAL})if(${USER_NAME}STRLESS_EQUAL测试)message(STATUS操作符STRLESS_EQUAL: TRUE)else()message(STATUS操作符STRLESS_EQUAL: FALSE)endif()string(COMPARE GREATER_EQUAL${USER_NAME}测试OUT_VAL)message(STATUS比较操作GREATER_EQUAL :${OUT_VAL})if(${USER_NAME}STRGREATER_EQUAL测试)message(STATUS操作符STRGREATER_EQUAL: TRUE)else()message(STATUS操作符STRGREATER_EQUAL: FALSE)endif()# MATCHESif(${USER_NAME}MATCHES([0-9])$)message(STATUS操作符MATCHES: TRUE)else()message(STATUS操作符MATCHES: FALSE)endif()# IN_LISTset(MY_LISTAppleOrangeGrape)if(${USER_NAME}IN_LIST MY_LIST)message(STATUS ${USER_NAME} is in the list)else()message(STATUS ${USER_NAME} is not in the list)endif()# hash与md5string(SHA1 OUT_VAL${USER_NAME})message(STATUSSHA1:${OUT_VAL})string(SHA256 OUT_VAL${USER_NAME})message(STATUSSHA256:${OUT_VAL})string(MD5 OUT_VAL${USER_NAME})message(STATUSMD5:${OUT_VAL})# ASCII码与十六进制string(ASCII72101108108111OUT_VAL)message(STATUSASCII:${OUT_VAL})string(HEX${USER_NAME}OUT_VAL)message(STATUSHEX:${OUT_VAL})二、列表1、常用操作操作类别子命令 (Sub-command)语法格式说明读取/查询LENGTHlist(LENGTH list output_var)获取列表元素个数。空列表长度为 0。GETlist(GET list index... output_var)获取指定索引的元素。支持多个索引结果为列表。JOINlist(JOIN list glue output_var)CMake 3.15。将列表元素用glue连接成一个字符串。FINDlist(FIND list value output_var)查找值首次出现的索引。未找到返回 -1。区分大小写。修改/增删APPENDlist(APPEND list element...)在列表末尾追加元素。最常用。PREPENDlist(PREPEND list element...)CMake 3.15。在列表开头插入元素。INSERTlist(INSERT list index element...)在指定索引前插入元素。POP_BACKlist(POP_BACK list [output_var...])CMake 3.15。移除并可选地返回最后一个元素。POP_FRONTlist(POP_FRONT list [output_var...])CMake 3.15。移除并可选地返回第一个元素。REMOVE_ITEMlist(REMOVE_ITEM list value...)移除列表中所有等于value的元素。REMOVE_ATlist(REMOVE_AT list index...)移除指定索引处的元素。注意索引从后往前移除以避免偏移问题或小心处理。FILTERlist(FILTER list {INCLUDE|EXCLUDE} REGEX regex)CMake 3.6。根据正则表达式保留或移除元素。排序/去重SORTlist(SORT list [COMPARE mode] [CASE mode] [ORDER mode])对列表进行排序。默认字典序、区分大小写、升序。REVERSElist(REVERSE list)反转列表顺序。REMOVE_DUPLICATESlist(REMOVE_DUPLICATES list)移除重复元素保持首次出现的顺序。其他TRANSFORMlist(TRANSFORM list action ...)CMake 3.12。对每个元素执行操作如转大写、追加后缀等。2、举例说明# 创建set(LST_FRUIT 苹果 西瓜 梨 菠萝 榴莲)# 长度list(LENGTH LST_FRUIT count)message(STATUSLENGTH:${count})# 追加list(APPEND LST_FRUIT 香蕉)list(APPEND LST_FRUIT 香蕉 哈密瓜)# 反转list(REVERSE LST_FRUIT)message(STATUSReversed:${LST_FRUIT})# 去重list(REMOVE_DUPLICATES LST_FRUIT)message(STATUSREMOVE_DUPLICATES:${LST_FRUIT})# 默认排序list(SORT LST_FRUIT)message(STATUS默认排序:${LST_FRUIT})# 不区分大小写排序list(SORT LST_FRUIT CASE INSENSITIVE)message(STATUS不区分大小写排序:${LST_FRUIT})# 自然排序list(SORT LST_FRUIT COMPARE NATURAL)message(STATUS自然排序:${LST_FRUIT})# 降序排序list(SORT LST_FRUIT ORDER DESCENDING)message(STATUS降序排序:${LST_FRUIT})list(SORT LST_FRUIT COMPARE NATURAL ORDER DESCENDING)message(STATUS降序排序:${LST_FRUIT})list(SORT LST_FRUIT CASE INSENSITIVE COMPARE NATURAL ORDER DESCENDING)message(STATUS降序排序:${LST_FRUIT})# 升序排序list(SORT LST_FRUIT ORDER ASCENDING)message(STATUS升序排序:${LST_FRUIT})list(SORT LST_FRUIT COMPARE NATURAL ORDER ASCENDING)message(STATUS升序排序:${LST_FRUIT})list(SORT LST_FRUIT CASE INSENSITIVE COMPARE NATURAL ORDER ASCENDING)message(STATUS升序排序:${LST_FRUIT})# 下标获取list(GET LST_FRUIT0FIRST_ITEM)list(GET LST_FRUIT13SECOND_AND_FOURTH)message(STATUSGET[0]:${FIRST_ITEM})message(STATUSGET[1,3):${SECOND_AND_FOURTH})# FIND查找list(FIND LST_FRUIT西瓜IDX)message(STATUSLST_FRUIT Index of 西瓜:${IDX})# JOIN拼接string(JOIN,OUT_VAL${LST_FRUIT})message(STATUSList连接成String(空格):${OUT_VAL})# 插入list(INSERT LST_FRUIT0芒果)message(STATUSINSERT后:${LST_FRUIT})# 移除指定值的元素list(REMOVE_ITEM LST_FRUIT 芒果 水果)message(STATUSREMOVE_ITEM后:${LST_FRUIT})# 移除特定索引的元素list(REMOVE_AT LST_FRUIT0)message(STATUSREMOVE_AT[0]后:${LST_FRUIT})list(REMOVE_AT LST_FRUIT02)message(STATUSREMOVE_AT[0,2)后:${LST_FRUIT})# POP_BACKlist(POP_BACK LST_FRUIT LAST_ITEM)message(STATUSPOP_BACK后:${LAST_ITEM}${LST_FRUIT})# POP_FRONTlist(POP_FRONT LST_FRUIT FIRST_ITEM)message(STATUSPOP_FRONT后:${FIRST_ITEM}${LST_FRUIT})# FILTER: 正则过滤list(FILTER LST_FRUIT INCLUDE REGEX^香)message(STATUSFILTER INCLUDE REGEX后:${LST_FRUIT})list(FILTER LST_FRUIT EXCLUDE REGEX^香)message(STATUSFILTER EXCLUDE REGEX后:${LST_FRUIT})set(FILESmain.cpputils.cppconfig.h)# TRANSFORM: 为每个元素添加前缀/后缀list(TRANSFORM FILES PREPENDsrc/)message(STATUSTRANSFORM With PREPEND:${FILES})list(TRANSFORM FILES APPEND.bak)message(STATUSTRANSFORM With APPEND:${FILES})# TRANSFORM: 大小写转换list(TRANSFORM FILES TOUPPER)message(STATUSTRANSFORM Upper:${FILES})list(TRANSFORM FILES TOLOWER)message(STATUSTRANSFORM Lower:${FILES})三、布尔值1、常用操作操作场景命令/语法说明示例定义布尔变量set(VAR ON)option(VAR Help ON)option()专门用于用户可配置的布尔开关。option(USE_SSL Enable SSL ON)条件判断if(VAR)if(NOT VAR)最核心的布尔判断。自动解析真假值。if(USE_SSL) ... endif()逻辑运算if(A AND B)if(A OR B)支持组合逻辑。if(UNIX AND NOT APPLE)比较运算if(A EQUAL B)数值比较布尔值本质是 0/1。if(VERBOSE EQUAL 1)字符串转布尔if(${VAR} STREQUAL ON)强制作为字符串比较避免隐式转换。用于严格检查配置项。布尔转字符串string(TOUPPER ${VAR} VAR_UP)无直接bool_to_string通常直接引用变量。${VAR}展开为 “ON” 或 “OFF”。取反操作if(NOT VAR)math(EXPR RESULT 1 - ${VAR})if中直接取反数学运算需数值化。if(NOT DEBUG_MODE)缓存布尔值set(VAR ON CACHE BOOL Desc)将布尔值存入缓存供ccmake/cmake-gui显示。set(BUILD_TESTING ON CACHE BOOL Build tests)2、举例说明# 使用 option 定义布尔开关推荐用于用户配置option(ENABLE_LOGGING日志启用开关OFF)message(STATUSENABLE_LOGGING:${ENABLE_LOGGING})# 使用 set 定义内部布尔变量set(DEBUG_MODE ON)message(STATUSDEBUG_MODE:${DEBUG_MODE})# 基本判断if(ENABLE_LOGGING)message(STATUSLogging is ENABLED)else()message(STATUSLogging is DISABLED)endif()# 取反判断if(NOT DEBUG_MODE)message(STATUS非Debug模式)else()message(STATUSDebug模式)endif()set(A ON)set(B OFF)set(C ON)# 复杂逻辑判断if(A AND(B OR C))message(STATUSA AND (B OR C): TRUE)endif()if(NOT A OR B)message(STATUS!(A OR B): FALSE)else()message(STATUS!(A OR B): TRUE)endif()四、路劲https://cmake.org/cmake/help/latest/command/cmake_path.html1、常用操作操作类别子命令 (Sub-command)语法示例说明初始化/设置SETcmake_path(SET var NORMALIZE path/to/file)设置路径并可选地规范化消除.和..。获取组件FILENAMEcmake_path(GET var FILENAME out)获取文件名含扩展名。STEMcmake_path(GET var STEM out)获取文件名不含扩展名部分。EXTENSIONcmake_path(GET var EXTENSION out)获取扩展名含.如.txt。PARENT_PATHcmake_path(GET var PARENT_PATH out)获取父目录路径。ROOT_NAMEcmake_path(GET var ROOT_NAME out)获取根名称Windows 下如C:或\\server。ROOT_PATHcmake_path(GET var ROOT_PATH out)获取根路径Unix 下为/Windows 下为C:/。RELATIVE_PARTcmake_path(GET var RELATIVE_PART out)获取去除根路径后的相对部分。判断/查询IS_ABSOLUTEcmake_path(IS_ABSOLUTE var OUT_VAR)判断是否为绝对路径。IS_RELATIVEcmake_path(IS_RELATIVE var OUT_VAR)判断是否为相对路径。HAS_FILENAMEcmake_path(HAS_FILENAME var OUT_VAR)判断是否有文件名部分。HAS_EXTENSIONcmake_path(HAS_EXTENSION var OUT_VAR)判断是否有扩展名。HAS_ROOT_NAMEcmake_path(HAS_ROOT_NAME var OUT_VAR)判断是否有根名称主要用于 Windows。修改/构建APPENDcmake_path(APPEND var subdir file.txt)追加路径组件。REMOVE_FILENAMEcmake_path(REMOVE_FILENAME var)移除文件名只保留目录。REPLACE_FILENAMEcmake_path(REPLACE_FILENAME var new.txt)替换文件名。转换CONVERTcmake_path(CONVERT var TO_CMAKE_PATH_LIST out)转换为CMake风格CONVERTcmake_path(CONVERT var TO_NATIVE_PATH_LIST out)转换为本地风格2、举例说明# EXISTS使用set(LOG_FILE_PATHd:/log/123.txt)if(EXISTS${LOG_FILE_PATH})message(STATUS${LOG_FILE_PATH}存在)else()message(STATUS${LOG_FILE_PATH}不存在)endif()# SET NORMALIZED_PATH 路劲规范化set(LOG_FILE_PATHd:/home/user/project/../src/./main.cpp)cmake_path(SET NORMALIZED_PATH NORMALIZE${LOG_FILE_PATH})message(STATUS路劲规范化:${NORMALIZED_PATH})# 获取文件名cmake_path(GET NORMALIZED_PATH FILENAME OUT_VAR)message(STATUS获取文件名:${OUT_VAR})# 获取文件名(不含扩展名)cmake_path(GET NORMALIZED_PATH STEM OUT_VAR)message(STATUS获取文件名(不含扩展名):${OUT_VAR})# 获取文件扩展名cmake_path(GET NORMALIZED_PATH EXTENSION OUT_VAR)message(STATUS获取文件扩展名:${OUT_VAR})# 获取上级目录cmake_path(GET NORMALIZED_PATH PARENT_PATH OUT_VAR)message(STATUS获取上级目录:${OUT_VAR})# 获取根名称cmake_path(GET NORMALIZED_PATH ROOT_NAME OUT_VAR)message(STATUS获取根名称:${OUT_VAR})# 获取根路径cmake_path(GET NORMALIZED_PATH ROOT_PATH OUT_VAR)message(STATUS获取根路径:${OUT_VAR})# 获取去除根路径后的相对部分cmake_path(GET NORMALIZED_PATH RELATIVE_PART OUT_VAR)message(STATUS获取去除根路径后的相对部分:${OUT_VAR})# 是否绝对路径cmake_path(IS_ABSOLUTE NORMALIZED_PATH OUT_VAR)message(STATUS是否绝对路径:${NORMALIZED_PATH}${OUT_VAR})# 是否相对路径cmake_path(IS_RELATIVE NORMALIZED_PATH OUT_VAR)message(STATUS是否相对路径:${NORMALIZED_PATH}${OUT_VAR})# 是否包含文件名cmake_path(HAS_FILENAME NORMALIZED_PATH OUT_VAR)message(STATUS是否包含文件名:${OUT_VAR})# 是否包含扩展名cmake_path(HAS_EXTENSION NORMALIZED_PATH OUT_VAR)message(STATUS是否包含扩展名:${OUT_VAR})# 是否有根名称cmake_path(HAS_ROOT_NAME NORMALIZED_PATH OUT_VAR)message(STATUS是否有根名称:${OUT_VAR})# 修改路径set(LOG_FILE_PATHd:/build)cmake_path(APPEND NORMALIZED_PATH${LOG_FILE_PATH}srcmain.cpp)message(STATUS修改路径:${NORMALIZED_PATH})# 替换文件名cmake_path(REPLACE_FILENAME NORMALIZED_PATHhello.cpp)message(STATUS替换文件名:${NORMALIZED_PATH})# 移除文件名只保留目录cmake_path(REMOVE_FILENAME NORMALIZED_PATH)message(STATUS移除文件名只保留目录:${NORMALIZED_PATH})# 转换为CMake格式set(win_pathC:\\Users\\zhangsan\\Project)cmake_path(CONVERT${win_path}TO_CMAKE_PATH_LIST OUT_VAR)message(STATUS转换为CMake格式:${OUT_VAR})# 转换为原生格式set(win_pathC:/Users/zhangsan/Project)cmake_path(CONVERT${win_path}TO_NATIVE_PATH_LIST OUT_VAR)message(STATUS转换为原生格式:${OUT_VAR})