news 2026/7/2 3:01:25

【CMake】[第十二篇] CMAKE_COMMAND 变量详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【CMake】[第十二篇] CMAKE_COMMAND 变量详解

CMAKE_COMMAND 变量详解

📖 什么是 CMAKE_COMMAND?

CMAKE_COMMAND是 CMake 的一个内置变量,它存储了当前使用的 CMake 可执行文件的完整路径

🔍 基本概念

变量值

CMAKE_COMMAND的值通常是:

  • Windows:C:/Program Files/CMake/bin/cmake.exe或类似路径
  • Linux/macOS:/usr/bin/cmake/usr/local/bin/cmake

查看变量值

你可以在 CMakeLists.txt 中查看它的值:

message(STATUS "CMAKE_COMMAND = ${CMAKE_COMMAND}")

输出示例

CMAKE_COMMAND = C:/Program Files/CMake/bin/cmake.exe

🎯 为什么使用 CMAKE_COMMAND?

1. 跨平台兼容性

使用${CMAKE_COMMAND}可以确保命令在所有平台上都能正确执行,因为:

  • 不需要硬编码 CMake 的路径
  • CMake 会自动找到正确的可执行文件
  • 支持不同的安装位置

2. 使用 CMake 的命令模式(-E 参数)

CMAKE_COMMAND最常用的方式是配合-E参数,执行 CMake 内置的跨平台命令。

📚 CMAKE_COMMAND -E 命令模式

语法

${CMAKE_COMMAND} -E <命令> [参数...]

-E参数告诉 CMake 执行一个跨平台的文件操作命令

常用命令

1. echo - 输出文本
${CMAKE_COMMAND} -E echo "Hello, World!"

作用:跨平台输出文本(Windows 和 Unix 都支持)

等价命令

  • Windows:echo Hello, World!
  • Linux:echo Hello, World!
2. copy - 复制文件
${CMAKE_COMMAND} -E copy <源文件> <目标文件>

示例

${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/config.txt ${CMAKE_BINARY_DIR}/config.txt

作用:跨平台复制文件

等价命令

  • Windows:copy config.txt build\config.txt
  • Linux:cp config.txt build/config.txt
3. copy_directory - 复制目录
${CMAKE_COMMAND} -E copy_directory <源目录> <目标目录>

示例

${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources ${CMAKE_BINARY_DIR}/resources
4. make_directory - 创建目录
${CMAKE_COMMAND} -E make_directory <目录路径>

示例

${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/output

作用:跨平台创建目录(包括父目录)

等价命令

  • Windows:mkdir outputmd output
  • Linux:mkdir -p output
5. remove - 删除文件
${CMAKE_COMMAND} -E remove <文件路径>

示例

${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/temp.txt
6. remove_directory - 删除目录
${CMAKE_COMMAND} -E remove_directory <目录路径>

示例

${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/output
7. touch - 创建或更新时间戳
${CMAKE_COMMAND} -E touch <文件路径>

示例

${CMAKE_COMMAND} -E touch ${CMAKE_BINARY_DIR}/timestamp.txt
8. tar - 打包/解包
# 打包 ${CMAKE_COMMAND} -E tar czf <压缩包> <文件或目录> # 解包 ${CMAKE_COMMAND} -E tar xzf <压缩包>

示例

# 创建压缩包 ${CMAKE_COMMAND} -E tar czf ${CMAKE_BINARY_DIR}/my_app.tar.gz $<TARGET_FILE:my_app> # 解压压缩包 ${CMAKE_COMMAND} -E tar xzf archive.tar.gz

参数说明

  • c= create(创建)
  • x= extract(解压)
  • z= gzip(压缩/解压)
  • f= file(文件)

💡 实际应用示例

示例1:在自定义命令中使用

add_custom_command( TARGET my_app POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:my_app> ${CMAKE_BINARY_DIR}/bin/$<TARGET_FILE_NAME:my_app> COMMENT "复制可执行文件" )

示例2:在自定义目标中使用

add_custom_target(setup COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/output COMMAND ${CMAKE_COMMAND} -E echo "设置完成" COMMENT "初始化构建环境" )

示例3:链式命令

add_custom_command( TARGET my_app POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "构建完成!" COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources $<TARGET_FILE_DIR:my_app>/resources COMMAND ${CMAKE_COMMAND} -E echo "资源文件已复制" )

⚠️ 注意事项

1. 不要使用平台特定命令

错误示例

# Windows 特定(在 Linux 上会失败) COMMAND copy file1.txt file2.txt # Linux 特定(在 Windows 上会失败) COMMAND cp file1.txt file2.txt

正确示例

# 跨平台 COMMAND ${CMAKE_COMMAND} -E copy file1.txt file2.txt

2. 路径分隔符

CMake 会自动处理路径分隔符,所以:

  • Windows: 可以使用/\
  • Linux: 使用/
# 这些都可以工作 ${CMAKE_COMMAND} -E copy src/file.txt build/file.txt ${CMAKE_COMMAND} -E copy src\file.txt build\file.txt # Windows

3. 变量展开

${CMAKE_COMMAND}会在配置阶段展开,所以:

  • 不需要担心路径中的空格
  • 不需要手动转义特殊字符
  • CMake 会自动处理

🔍 查看所有可用命令

你可以运行以下命令查看所有可用的-E命令:

cmake-Ehelp

输出示例

CMake Error: No command specified Available commands: capabilities - Report capabilities built into cmake in JSON format chdir dir cmd [args...] - run command in a given directory compare_files file1 file2 - check if file1 is same as file2 copy <file>... destination - copy files to destination (either file or directory) copy_directory <dir>... <dest-dir> - copy content of <dir>... directories to <dest-dir> copy_if_different <file>... destination - copy files if it has changed echo [<string>...] - displays arguments as text echo_append [<string>...] - displays arguments as text but no new line env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]... - run command in a modified environment environment - display the current environment variables make_directory <dir>... - create directories md5sum <file>... - create MD5 checksum of files sha1sum <file>... - create SHA1 checksum of files sha224sum <file>... - create SHA224 checksum of files sha256sum <file>... - create SHA256 checksum of files sha384sum <file>... - create SHA384 checksum of files sha512sum <file>... - create SHA512 checksum of files remove [-f] <file>... - remove the file(s), use -f to force it remove_directory <dir>... - remove directories and their contents rename oldname newname - rename a file or directory (on one volume) server - start cmake in server mode sleep <number>... - sleep for given number of seconds tar [cxt][vf][zjJ] file.tar [file/dir ...] - create or extract a tar file time command [args...] - run command and display elapsed time touch <file>... - touch a file touch_nocreate <file>... - touch a file if it exists but do not create it true - do nothing with an exit code of 0

📊 对比表

操作Windows 命令Linux 命令CMake 命令
复制文件copy file1.txt file2.txtcp file1.txt file2.txt${CMAKE_COMMAND} -E copy file1.txt file2.txt
创建目录mkdir dirmkdir -p dir${CMAKE_COMMAND} -E make_directory dir
删除文件del file.txtrm file.txt${CMAKE_COMMAND} -E remove file.txt
删除目录rmdir /s dirrm -rf dir${CMAKE_COMMAND} -E remove_directory dir
输出文本echo textecho text${CMAKE_COMMAND} -E echo text

🎯 总结

  1. CMAKE_COMMAND= CMake 可执行文件的路径

  2. ${CMAKE_COMMAND} -E= 使用 CMake 的跨平台命令模式

  3. 优势

    • ✅ 跨平台兼容
    • ✅ 自动处理路径
    • ✅ 不需要硬编码路径
    • ✅ 统一命令接口
  4. 最佳实践

    • 在自定义命令中优先使用${CMAKE_COMMAND} -E
    • 避免使用平台特定的 shell 命令
    • 利用 CMake 的跨平台能力

参考

  • CMake 官方文档 - Command-Line Tool
  • CMake 官方文档 - CMAKE_COMMAND
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 23:45:28

【求职招聘】2025年 AI Agent 开发岗位的面试题整理(+必过答案解析)

【求职招聘】2025年 AI Agent 开发岗位的面试题整理(+必过答案解析) 文章目录 【求职招聘】2025年 AI Agent 开发岗位的面试题整理(+必过答案解析) ======================================== 第一部分:核心 Agent 架构与原理 (高频必问) 第二部分:蚂蚁金服特色技术与场景…

作者头像 李华
网站建设 2026/7/1 17:37:01

开源阅读鸿蒙版:三步打造你的专属数字书房

想在鸿蒙设备上拥有一个完全免费、无广告干扰的私人阅读空间吗&#xff1f;开源阅读鸿蒙版正是为你量身打造的数字书房解决方案。这款专为鸿蒙生态优化的开源阅读器&#xff0c;通过简单的配置就能让你从全网抓取小说、漫画和资讯内容&#xff0c;享受纯净的阅读体验。 【免费下…

作者头像 李华
网站建设 2026/7/1 10:26:06

2025全球国内网络安全大事,一文看透未来走向

2025全球国内网络安全大事&#xff0c;一文看透未来走向 2025年&#xff0c;AI热潮席卷全球的同时&#xff0c;网络安全领域亦暗流涌动。远程办公的安全漏洞、量子计算对加密体系的冲击、地缘政治引发的政策变动&#xff0c;让这一年的网络空间格外不平静。 网络安全早已跳出…

作者头像 李华
网站建设 2026/6/16 20:59:18

跨语言混合文本合成能力实测:中英夹杂无压力

跨语言混合文本合成能力实测&#xff1a;中英夹杂无压力 在短视频、虚拟主播和AI内容创作爆发的今天&#xff0c;语音合成早已不再是“把文字念出来”那么简单。用户要的不是机械朗读&#xff0c;而是像真人一样自然表达——有情绪起伏、能跨语言切换、音色个性化&#xff0c;甚…

作者头像 李华
网站建设 2026/6/18 6:02:57

如何将安卓手机变成万能键盘鼠标:USB HID Client新手完全指南

USB HID Client是一款革命性的安卓应用&#xff0c;它能让你的手机瞬间变身为电脑、电视、娱乐终端等设备的键盘和鼠标&#xff0c;无需在目标设备安装任何软件。通过底层HID协议模拟技术&#xff0c;手机可以被识别为标准输入设备&#xff0c;支持从日常办公到BIOS调试的全场景…

作者头像 李华
网站建设 2026/6/29 22:08:41

系统发育树+环境因子如何关联?R语言多变量分析的4个关键步骤

第一章&#xff1a;系统发育树与环境因子关联分析概述在生态学与微生物组研究中&#xff0c;理解物种演化关系与其生存环境之间的相互作用至关重要。系统发育树不仅揭示了不同生物类群的进化历史&#xff0c;还为解析群落构建机制提供了结构基础。将系统发育信息与环境因子进行…

作者头像 李华