news 2026/8/17 21:58:44

CMake基础语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake基础语法

文章目录

  • CMake与Make的关系
  • 变量
    • 变量类型
      • 环境变量(系统层级与cmake无关)
      • cmake缓存变量
      • cmake普通变量
    • ${变量名}
    • set(<变量名> <值>)
  • cmake_minimum_required(VERSION <版本号>)
  • project(< 工程文件名 >)
  • find_package(<包名>)
  • install(TARGETS < 目标文件 > DESTINATION < 安装位置 >)
    • 安装目标文件(所有类型)
    • 安装文件夹
    • 其他
  • add_executable(<可执行文件名> <源文件列表>)
  • message( <日志类型> "<打印信息>")

CMake与Make的关系

在linux当中,其关系如下

注意:CMake本身并不提供编译工具,仅提供连接关系,也就是说仍然需要安装gcc等编译工具

变量

变量类型

环境变量(系统层级与cmake无关)

存在操作系统中,用$ENV{}访问

cmake缓存变量

缓存变量 存在 CMakeCache.txt 中(永久)
用${}访问

cmake普通变量

普通变量 只在CMake运行期间存在(临时)
用${}访问

${变量名}

这些变量可以在build目录下的CMakeCache.txt当中查看

catCMakeCache.txt|grepPROJECT_NAME

set(<变量名> <值>)

设置变量

cmake_minimum_required(VERSION <版本号>)

规定了此CMakeLists.txt所需要的最小的cmake版本

project(< 工程文件名 >)

当你写了 project(cpp05_exercise),CMake 会自动定义以下内容
基本变量
${PROJECT_NAME} # cpp05_exercise
${CMAKE_PROJECT_NAME} # cpp05_exercise
${PROJECT_SOURCE_DIR} # 源码目录路径
${PROJECT_BINARY_DIR} # 构建目录路径
如果有版本号
${PROJECT_VERSION} # 1.0.0 (如果指定了)
${PROJECT_VERSION_MAJOR} # 1
${PROJECT_VERSION_MINOR} # 0
${PROJECT_VERSION_PATCH} # 0
其他相关变量
${PROJECT_SOURCE_DIR} # 当前项目的源码目录
${PROJECT_BINARY_DIR} # 当前项目的构建目录

find_package(<包名>)

用于自动查找功能包

#1.最基本形式find_package(rclcpp)#2.必需包(找不到就报错)find_package(rclcpp REQUIRED)#3.指定版本find_package(Python33.6REQUIRED)

install(TARGETS < 目标文件 > DESTINATION < 安装位置 >)

安装目标文件(所有类型)

install(TARGETS < 目标文件 >


DESTINATION < 安装到哪里 >)

install(TARGETS demo01_talker_str demo02_listener_str demo03_talker_stu demo04_listener_stu DESTINATION lib/${PROJECT_NAME})

安装文件夹

install(DIRECTORY < 目标文件夹 >


DESTINATION < 安装到哪里 >)

install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})

其他

install(FILES < file >… […])
install(SCRIPT < file > […])
install(CODE < code > […])
install(EXPORT < export-name > […])
install(RUNTIME_DEPENDENCY_SET < set-name > […])

add_executable(<可执行文件名> <源文件列表>)

添加可执行文件

add_executable(demo01_talker_str src/demo01_talker_str.cpp)

注意:一个可执行文件只能有一个main函数 (源文件列表只能有一个main,但可以增加别的被调用的cpp)
在源文件列表当中只需要包含cpp文件即可(h文件不用写在里面)

message( <日志类型> “<打印信息>”)

日志类型
STATUS:在终端会以 --(两个横线加空格)为前缀显示
WARNING:黄色警告(构建会继续)
SEND_ERROR:错误(跳过生成,但继续处理)
FATAL_ERROR:致命错误(立即终止处理)

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

从客厅到笔记本,一篇文章玩转 Jellyfin Desktop 桌面客户端

从客厅到笔记本&#xff0c;一篇文章玩转 Jellyfin Desktop 桌面客户端 【免费下载链接】jellyfin-desktop Jellyfin Desktop Client 项目地址: https://gitcode.com/GitHub_Trending/je/jellyfin-desktop 周五晚上&#xff0c;我窝在沙发上想重温一部老电影&#xff0c…

作者头像 李华
网站建设 2026/8/17 21:54:45

单链表算法题(二):进阶技巧篇

单链表算法题&#xff08;二&#xff09;&#xff1a;进阶技巧篇 前言 在上一篇中&#xff0c;我们学习了链表题目的四大基本功&#xff1a;哨兵位、三指针反转、快慢指针找中点、归并合并。这些技巧足以应对大部分基础题目。 本篇将进入进阶领域&#xff0c;讲解三道更复杂…

作者头像 李华
网站建设 2026/8/17 21:49:28

Oracle数据库核心架构解析与实战入门指南

1. 从“神话”到“基石”&#xff1a;我眼中的Oracle数据库 提到Oracle数据库&#xff0c;很多刚入行的朋友可能会觉得它像一座古老而威严的神殿&#xff0c;充满了神秘感。它常常与“大型企业”、“核心系统”、“昂贵”这些标签绑定在一起。在我十多年的技术生涯里&#xff0…

作者头像 李华