CMake 常用语法与函数方法指南

内容分享7小时前发布
0 0 0

CMake 常用语法与函数方法指南

第1章:CMake 基础语法

1.1 CMake 基本结构

“`cmake

# 最低版本要求

cmake_minimum_required(VERSION 3.10)

# 项目定义

project(MyProject

VERSION 1.0.0

DESCRIPTION “项目描述”

LANGUAGES C CXX

)

# 设置C++标准

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_CXX_EXTENSIONS OFF)

“`

1.2 变量操作

“`cmake

# 设置变量

set(MY_VARIABLE “value”)

set(MY_LIST item1 item2 item3)

# 列表操作

list(APPEND MY_LIST item4)

list(REMOVE_ITEM MY_LIST item2)

list(LENGTH MY_LIST list_length)

# 字符串操作

string(LENGTH ${MY_VARIABLE} str_len)

string(TOUPPER ${MY_VARIABLE} upper_str)

string(REPLACE “old” “new” result ${MY_VARIABLE})

# 条件判断

if(DEFINED MY_VARIABLE)

message(“变量已定义”)

elseif(MY_VARIABLE STREQUAL “value”)

message(“值相等”)

endif()

# 循环

foreach(item IN LISTS MY_LIST)

message(“Item: ${item}”)

endforeach()

foreach(i RANGE 1 10)

message(“Index: ${i}”)

endforeach()

“`

第2章:常用命令与函数

2.1 项目配置命令

“`cmake

# 添加可执行文件

add_executable(target_name source1.cpp source2.cpp)

# 添加库

add_library(lib_name STATIC source.cpp) # 静态库

add_library(lib_name SHARED source.cpp) # 动态库

add_library(lib_name INTERFACE) # 接口库

# 包含目录

include_directories(${CMAKE_SOURCE_DIR}/include)

target_include_directories(target_name

PUBLIC ${CMAKE_SOURCE_DIR}/include

PRIVATE ${CMAKE_SOURCE_DIR}/src

)

# 链接库

target_link_libraries(target_name

PRIVATE library1 library2

PUBLIC library3

)

“`

2.2 文件操作命令

“`cmake

# 文件查找

file(GLOB source_files “src/*.cpp”)

file(GLOB_RECURSE all_sources “src/*.cpp” “include/*.h”)

# 文件操作

file(READ filename variable)

file(WRITE filename “content”)

file(APPEND filename “more content”)

file(COPY files… DESTINATION dir)

# 目录操作

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)

“`

2.3 控制流命令

“`cmake

# 条件编译

option(ENABLE_FEATURE “启用特性” ON)

if(ENABLE_FEATURE)

add_definitions(-DENABLE_FEATURE)

endif()

# 平台检测

if(WIN32)

message(“Windows平台”)

elseif(UNIX AND NOT APPLE)

message(“Linux平台”)

elseif(APPLE)

message(“macOS平台”)

endif()

# 循环控制

while(condition)

# 循环体

break() # 退出循环

continue() # 继续下一次循环

endwhile()

“`

2.4 消息与调试

“`cmake

# 输出消息

message(“普通消息”)

message(STATUS “状态消息”)

message(WARNING “警告消息”)

message(AUTHOR_WARNING “作者警告”)

message(SEND_ERROR “发送错误”)

message(FATAL_ERROR “致命错误”)

# 变量打印

message(“变量值: ${MY_VARIABLE}”)

“`

第3章:常用内置函数

3.1 字符串处理函数

“`cmake

# 字符串查找

string(FIND ${str} substring result)

string(SUBSTRING ${str} 0 5 result)

# 正则表达式

string(REGEX MATCH “pattern” result ${str})

string(REGEX REPLACE “old” “new” result ${str})

# 格式转换

string(TIMESTAMP output “%Y-%m-%d %H:%M:%S”)

“`

3.2 数学运算函数

“`cmake

# 数学计算

math(EXPR result “1 + 2 * 3”)

math(EXPR hex_value “0x${hex_string}” OUTPUT_FORMAT HEXADECIMAL)

“`

3.3 路径处理函数

“`cmake

# 路径操作

get_filename_component(dir_name ${path} DIRECTORY)

get_filename_component(file_name ${path} NAME)

get_filename_component(base_name ${path} NAME_WE)

get_filename_component(ext_name ${path} EXT)

# 路径转换

file(RELATIVE_PATH rel_path ${base_dir} ${full_path})

“`

3.4 配置相关函数

“`cmake

# 配置头文件

configure_file(config.h.in config.h)

# 生成导出头文件

include(GenerateExportHeader)

generate_export_header(TARGET_NAME)

# 添加子目录

add_subdirectory(subdir)

“`

第4章:高级特性

4.1 函数与宏

“`cmake

# 定义函数(有作用域)

function(my_function arg1 arg2)

set(${arg1}_local “value” PARENT_SCOPE)

message(“参数: ${arg1}, ${arg2}”)

endfunction()

# 定义宏(无作用域)

macro(my_macro arg1 arg2)

set(${arg1}_global “value”)

message(“参数: ${arg1}, ${arg2}”)

endmacro()

“`

4.2 生成器表达式

“`cmake

# 条件表达式

target_compile_definitions(target_name

PRIVATE $<$<CONFIG:Debug>:DEBUG_MODE>

)

# 目标属性表达式

$<TARGET_FILE:target_name>

$<TARGET_LINKER_FILE:target_name>

$<TARGET_PROPERTY:target_name,prop_name>

# 字符串生成器

$<UPPER_CASE:${string}>

$<LOWER_CASE:${string}>

“`

4.3 自定义命令

“`cmake

# 添加自定义命令

add_custom_command(

OUTPUT output_file

COMMAND ${CMAKE_COMMAND} -E echo “Building…”

DEPENDS input_file

COMMENT “正在生成文件”

)

# 自定义目标

add_custom_target(custom_target

COMMAND ${CMAKE_COMMAND} -E echo “Running…”

DEPENDS dependency_target

)

“`

CMake 常用内置变量表格

平台与系统变量

变量名 描述 示例值

CMAKE_SYSTEM_NAME 操作系统名称 Linux, Windows, Darwin

CMAKE_SYSTEM_VERSION 操作系统版本 10.0.19041

CMAKE_SYSTEM_PROCESSOR 处理器架构 x86_64, AMD64, ARM64

WIN32 Windows平台标识 TRUE (Windows)

UNIX Unix-like平台标识 TRUE (Linux/macOS)

APPLE Apple平台标识 TRUE (macOS/iOS)

ANDROID Android平台标识 TRUE (Android)

MSVC MSVC编译器标识 TRUE (Visual Studio)

项目路径变量

变量名 描述 示例值

CMAKE_SOURCE_DIR 顶层CMakeLists.txt所在目录 /home/user/project

CMAKE_BINARY_DIR 构建目录(build) /home/user/project/build

CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt目录 /home/user/project/src

CMAKE_CURRENT_BINARY_DIR 当前构建目录
/home/user/project/build/src

CMAKE_CURRENT_LIST_DIR 当前正在处理的CMake文件目录 /home/user/project/cmake

CMAKE_CURRENT_LIST_FILE 当前正在处理的CMake文件路径
/home/user/project/cmake/module.cmake

编译器相关变量

变量名 描述 示例值

CMAKE_C_COMPILER C编译器路径 /usr/bin/gcc

CMAKE_CXX_COMPILER C++编译器路径 /usr/bin/g++

CMAKE_C_COMPILER_ID C编译器ID GNU, Clang, MSVC

CMAKE_CXX_COMPILER_ID C++编译器ID GNU, Clang, MSVC

CMAKE_C_FLAGS C编译器标志 -Wall -Wextra

CMAKE_CXX_FLAGS C++编译器标志 -Wall -Wextra -std=c++11

CMAKE_BUILD_TYPE 构建类型 Debug, Release, RelWithDebInfo, MinSizeRel

安装相关变量

变量名 描述 默认值

CMAKE_INSTALL_PREFIX 安装前缀 /usr/local (Unix), C:/Program Files (Windows)

CMAKE_INSTALL_BINDIR 可执行文件安装目录 bin

CMAKE_INSTALL_LIBDIR 库文件安装目录 lib

CMAKE_INSTALL_INCLUDEDIR 头文件安装目录 include

CMAKE_INSTALL_DATADIR 数据文件安装目录 share

生成器相关变量

变量名 描述 示例值

CMAKE_GENERATOR CMake生成器 Unix Makefiles, Ninja, Visual Studio 16 2019

CMAKE_MAKE_PROGRAM Make程序路径 /usr/bin/make, /usr/bin/ninja

CMAKE_BUILD_TOOL 构建工具 msbuild.exe, devenv.exe

模块与包变量

变量名 描述 示例值

CMAKE_MODULE_PATH CMake模块搜索路径 /home/user/cmake/modules

CMAKE_PREFIX_PATH 包搜索路径 /usr/local;/opt/local

CMAKE_INCLUDE_PATH 头文件搜索路径

CMAKE_LIBRARY_PATH 库文件搜索路径

目标文件变量

变量名 描述 示例值


CMAKE_RUNTIME_OUTPUT_DIRECTORY 可执行文件输出目录 ${CMAKE_BINARY_DIR}/bin


CMAKE_LIBRARY_OUTPUT_DIRECTORY 库文件输出目录 ${CMAKE_BINARY_DIR}/lib


CMAKE_ARCHIVE_OUTPUT_DIRECTORY 静态库输出目录 ${CMAKE_BINARY_DIR}/lib

CMAKE_CURRENT_LIST_LINE 当前处理的行号 42

版本信息变量

变量名 描述 示例值

CMAKE_VERSION CMake版本 3.22.1

CMAKE_MAJOR_VERSION CMake主版本 3

CMAKE_MINOR_VERSION CMake次版本 22

CMAKE_PATCH_VERSION CMake补丁版本 1

配置相关变量

变量名 描述 示例值

CMAKE_CONFIGURATION_TYPES 多配置生成器的配置类型 Debug;Release;MinSizeRel;RelWithDebInfo

CMAKE_CFG_INTDIR 配置相关中间目录 . (Makefile), $(Configuration) (VS)

CMAKE_BUILD_TYPE 单配置生成器的构建类型 Debug, Release

编译特性变量

变量名 描述 示例值

CMAKE_C_COMPILE_FEATURES C编译器支持的特性列表 c_std_99;c_std_11


CMAKE_CXX_COMPILE_FEATURES C++编译器支持的特性列表 cxx_std_11;cxx_std_14;cxx_std_17

CMAKE_C_STANDARD C语言标准 11, 99

CMAKE_CXX_STANDARD C++语言标准 11, 14, 17, 20

测试相关变量

变量名 描述 示例值

CMAKE_CTEST_COMMAND CTest命令路径 /usr/local/bin/ctest

CMAKE_TESTING_ENABLED 是否启用测试 ON

附录:实用代码片段

A.1 常用宏定义

“`cmake

# 打印所有变量

macro(print_all_variables)

get_cmake_property(vars VARIABLES)

foreach(var ${vars})

message(“${var}=${${var}}”)

endforeach()

endmacro()

# 打印目标属性

function(print_target_properties target)

if(NOT TARGET ${target})

message(“目标 ${target} 不存在”)

return()

endif()

get_target_property(target_type ${target} TYPE)

message(“目标: ${target} (类型: ${target_type})”)

set(props IMPORTED_LOCATION IMPORTED_LOCATION_<CONFIG>

INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES

INCLUDE_DIRECTORIES LINK_LIBRARIES COMPILE_DEFINITIONS

COMPILE_OPTIONS)

foreach(prop ${props})

get_target_property(prop_val ${target} ${prop})

if(prop_val)

message(” ${prop}: ${prop_val}”)

endif()

endforeach()

endfunction()

“`

A.2 常用函数

“`cmake

# 递归查找源文件

function(find_sources_recursive return_var directory)

file(GLOB_RECURSE sources

“${directory}/*.cpp”

“${directory}/*.c”

“${directory}/*.cc”

“${directory}/*.cxx”

)

set(${return_var} ${sources} PARENT_SCOPE)

endfunction()

# 设置目标标准

function(set_target_standard target standard)

set_target_properties(${target} PROPERTIES

CXX_STANDARD ${standard}

CXX_STANDARD_REQUIRED ON

CXX_EXTENSIONS OFF

)

endfunction()

“`

A.3 版本配置模板

“`cmake

# version.h.in

#define PROJECT_NAME “@PROJECT_NAME@”

#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@

#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@

#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@

#define PROJECT_VERSION “@PROJECT_VERSION@”

“`

本指南涵盖了CMake的常用语法、函数和内置变量

© 版权声明

相关文章

暂无评论

none
暂无评论...