【构建】CMake 常用函数和命令清单

CMake 常用函数和命令清单


1 基本配置函数

命令说明
cmake_minimum_required(VERSION 3.XX)设置 CMake 最低版本要求
project(MyProject LANGUAGES C CXX)设置工程名称和语言
set(VAR VALUE)设置变量
message(STATUS "Text")打印调试信息(也有 WARNING, FATAL_ERROR

2 路径/文件相关

命令说明
file(GLOB VAR "*.cpp")匹配当前目录下所有 cpp 文件(不推荐用于源文件管理)
file(MAKE_DIRECTORY dir)创建目录
file(READ path content)读取文件内容到变量
file(WRITE path content)写入文件内容
file(COPY src DESTINATION dst)拷贝文件/目录
get_filename_component(var path NAME/EXT/DIRECTORY)获取路径组件

3 编译相关(targets)

命令说明
add_executable(target main.cpp)添加可执行文件
add_library(libname STATIC src.cpp)添加静态库
add_library(libname SHARED src.cpp)添加动态库
target_sources(target PRIVATE src.cpp)添加源文件到 target(推荐方式)
target_include_directories(target PUBLIC path)添加头文件路径
target_compile_options(target PRIVATE -Wall)添加编译器选项
target_compile_definitions(target PRIVATE MACRO)添加宏定义
target_link_libraries(target PRIVATE lib)链接依赖库
target_link_directories(target PRIVATE path)链接库路径

4 依赖管理

命令说明
find_package(Pkg REQUIRED)查找系统/外部库
include(Foo.cmake)引入其他 CMake 脚本
add_subdirectory(path)添加子目录(可用于引入模块)
find_library(VAR name PATHS ...)手动查找库文件

5 条件/循环控制

命令说明
if(CONDITION) / elseif / else / endif()条件判断
foreach(VAR list) / endforeach()遍历循环
while(CONDITION) / endwhile()循环

6 安装与导出

命令说明
install(TARGETS ...)安装目标(可执行文件/库)
install(FILES header DESTINATION include)安装头文件等资源
export(TARGETS ... FILE cmakefile)导出 CMake 配置用于其他项目
configure_file(in out @ONLY)生成配置文件(自动替换变量)

7 编译选项和工具链

命令说明
set(CMAKE_CXX_STANDARD 17)设置 C++ 标准
set(CMAKE_BUILD_TYPE Debug)设置构建类型
set(CMAKE_C_COMPILER gcc)设置 C 编译器
set(CMAKE_CXX_FLAGS "-O2")设置 C++ 编译选项(全局)

8 包与模块集成(现代 CMake 推荐)

命令说明
FetchContent_Declare()声明并拉取远程依赖库(CMake 3.11+)
FetchContent_MakeAvailable()将 FetchContent 加入工程
include(FetchContent)引入 FetchContent 模块
find_package(Pkg CONFIG REQUIRED)优先使用包自带的 PkgConfig

9 测试支持

命令说明
enable_testing()启用测试功能
add_test(NAME test COMMAND ./bin)添加测试
include(CTest)集成 CTest 测试框架

10 宏/函数定义

命令说明
function(NAME arg1 arg2)定义函数(可作用域变量)
macro(NAME arg1 arg2)定义宏(无作用域)
return()从函数返回

function应用

主要涉及函数定义、参数传递、作用域、返回值模拟等,适合日常项目和中大型工程模块化构建。

  • 基础语法
function(func_name [arg1 [arg2 [...]]])
    # 函数体
endfunction()

函数内部的变量默认是 局部作用域,与 macro() 不同(macro 无作用域)。

  • 常用 CMake 函数示例清单
  1. 打印变量值的通用调试函数
function(print_var VAR)
    message(STATUS "${VAR} = [${${VAR}}]")
endfunction()

调用:

set(MY_PATH "/usr/local")
print_var(MY_PATH)

  1. 添加 include 目录(多模块项目常用)
function(add_my_include TARGET DIR)
    target_include_directories(${TARGET} PRIVATE ${DIR})
endfunction()

调用:

add_my_include(MyLib "${CMAKE_SOURCE_DIR}/include")

  1. 递归添加子目录(自动添加所有子模块)
function(add_all_subdirs DIR)
    file(GLOB CHILDREN RELATIVE ${DIR} ${DIR}/*)
    foreach(child ${CHILDREN})
        if(IS_DIRECTORY ${DIR}/${child})
            add_subdirectory(${DIR}/${child})
        endif()
    endforeach()
endfunction()

调用:

add_all_subdirs(${CMAKE_SOURCE_DIR}/modules)

  1. 模拟返回值:通过 PARENT_SCOPE
function(get_file_size FILE_PATH RETURN_VAR)
    file(SIZE ${FILE_PATH} SIZE_VAR)
    set(${RETURN_VAR} ${SIZE_VAR} PARENT_SCOPE)
endfunction()

调用:

get_file_size("main.cpp" FILE_SIZE)
message(STATUS "main.cpp size = ${FILE_SIZE}")

  1. 添加一组源文件到 target(工程通用)
function(add_sources TARGET)
    foreach(src IN LISTS ARGN)
        target_sources(${TARGET} PRIVATE ${src})
    endforeach()
endfunction()

调用:

add_sources(MyApp main.cpp util.cpp net.cpp)

  1. 条件设置 C++ 标准(可重用模块)
function(set_cpp_standard TARGET VERSION)
    target_compile_features(${TARGET} PUBLIC cxx_std_${VERSION})
endfunction()

调用:

set_cpp_standard(MyApp 20)

  1. 设置编译选项(支持多个参数)
function(add_compile_flags TARGET)
    foreach(flag IN LISTS ARGN)
        target_compile_options(${TARGET} PRIVATE ${flag})
    endforeach()
endfunction()

调用:

add_compile_flags(MyApp -Wall -Wextra -Werror)

  • 函数 vs 宏的区别
特性function()macro()
变量作用域局部作用域(可使用 PARENT_SCOPE全局作用域(共享变量)
调用开销较小(推荐)更快但容易出错
推荐用途所有模块化封装函数极简快捷逻辑

构建 大型 C++ 项目、组件化中间件、跨平台库,建议把常用函数统一写入 cmake/functions.cmakeinclude() 引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值