当前位置: 首页 > ai >正文

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

文章目录

  • CMake 常用函数和命令清单
    • 1 基本配置函数
    • 2 路径/文件相关
    • 3 编译相关(targets)
    • 4 依赖管理
    • 5 条件/循环控制
    • 6 安装与导出
    • 7 编译选项和工具链
    • 8 包与模块集成(现代 CMake 推荐)
    • 9 测试支持
    • 10 宏/函数定义
      • function应用

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() 引用。

http://www.xdnf.cn/news/12821.html

相关文章:

  • leetcode189-轮转数组
  • Prefix Caching 详解:实现 KV Cache 的跨请求高效复用
  • c++对halcon的动态链接库dll封装及调用(细细讲)
  • 【CSS-8】深入理解CSS选择器权重:掌握样式优先级的关键
  • 【拆机系列】暴力拆解AOC E2270SWN6液晶显示屏
  • Python训练营打卡Day48(2025.6.8)
  • 【LangChain4J】LangChain4J 第三弹:多模态与文生图的实现
  • leetcode_56 合并区间
  • el-table的select回显问题
  • 图解JavaScript原型:原型链及其分析 | JavaScript图解
  • Alight Motion汉化版:视频剪辑,轻松上手
  • odoo17 反常下表引用上表并能修改
  • 在数字工厂实施过程中,如何学会通过梳理流程的思想来分析解决问题
  • 2014-2023年 最新绿色债券数据
  • 大数据CSV导入MySQL
  • word操作(持续更新)
  • 从菜鸟到骑士:TypeScript 基础修炼手册
  • 磁盘空间清道夫FolderSize 系列:可视化分析 + 重复文件识别,
  • 设备健康管理的范式革命:中讯烛龙全链路智能守护系统
  • QTreeWidget 应用场景与用法详解
  • 华为OD机试-食堂供餐-二分法
  • 408第一季 - 数据结构 - 图II
  • MS8551/MS8552/MS8554 单电源、轨到轨输入输出、高精度运放,可替代AD8551/AD8552/AD8554
  • Android 大文件分块上传实战:突破表单数据限制的完整方案
  • 把二级域名绑定的wordpress网站的指定页面
  • 【论文阅读28】-CNN-BiLSTM-Attention-(2024)
  • UML用例模型与用例图
  • 【RK3588嵌入式图形编程】-Cairo- 变换、旋转、缩放、剪切
  • C++基础进阶:函数、内联函数与Lambda函数详解
  • 开源项目实战学习之YOLO11:12.8 ultralytics-models-utils.py