news 2026/2/11 6:05:19

cmake_CMake打印消息命令message(),CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR,CMAKE_CURRENT_LIST_FILE/DIR/LINE/FILE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_CMake打印消息命令message(),CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR,CMAKE_CURRENT_LIST_FILE/DIR/LINE/FILE

文章目录

  • 第二章 CMake基础语法
    • 2.12 CMake打印消息命令message()
      • 2.12.1 message()命令格式
      • 2.12.2 设置日志等级CMAKE_MESSAGE_LOG_LEVEL
      • 2.12.3 测试源码
    • 2.13 CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR
      • 2.13.1 测试顶层 CMAKE SOURCE变量
      • 2.13.2 测试顶层BINARY相关变量
    • 2.14 CMAKE_CURRENT_LIST_FILE/DIR/LINE/FILE
    • 2.15 CMake定义环境变量set( ENV{} )命令
      • 2.15.1 获取OS环境变量
      • 2.15.2 修改环境变量
      • 2.15.3 CMAKE内置环境变量
      • 2.15.4 编译时指定的变量

本文记录CMake打印消息命令message(),CMAKE_SOURCE_DIRCMAKE_BINARY_DIR,CMAKE_CURRENT_LIST_FILE/DIR/LINE/FIL。

第二章 CMake基础语法

2.12 CMake打印消息命令message()

2.12.1 message()命令格式

message()用于输出消息到控制台,参数指定消息模式,如果给出多个消息字符串,它们将连接成一条消息,字符串之间没有分隔符。
message原型:

message([<mode>]"message text')mode参数: TRACE:临时的、实现细节的细粒度消息 DEBUG 为开发人员提供的调试消息, VERBOSE 为用户提供的详细的(冗长的)消息。 STATUS 用户可能感兴趣的消息。 NOTICE 或 不写: 重要消息打印到stderr以吸引用户注意 DEPRECATION 弃用错误或警告消息 AUTHOR WARNING 开发者警告消息,继续处理, WARNING 警告消息,继续处理, SEND ERROR 错误消息,CMake继续处理,但跳过生成, FATAL ERROR 致命错误消息,CMake停止处理和生成。

2.12.2 设置日志等级CMAKE_MESSAGE_LOG_LEVEL

设置此变量指定message()命令的日志记录级别,可设置的值为ERROR WARRING NOTICE, STATUS(默认),VERBOSE DEBUG TRACE
设置日志等级时可以使用 cmake –log-level=XXX
日志从高到低:

ERROR>WARNING>NOTICE>STATUS(默认)>VERBOSE>DEBUG>TRACE

设置日志级别后,message只会输出指定日志级别或更高日志级别。比如指定最高的ERROR日志级别后,只输出EEROR级别的message。

2.12.3 测试源码

cmake_minimum_required(VERSION3.22)# 设置日志等级set(CMAKE_MESSAGE_LOG_LEVEL ERROR)# 获取默认日志等级cmake_language(GET_MESSAGE_LOG_LEVEL var)message("日志级别:${var}")# 日志级别: TRACE# 显示日志message(TRACE 测试TRACE消息)message(DEBUG 测试DEBUG消息)message(VERBOSE 测试VERBOSE消息)message(STATUS 测试STATUS消息)# 输出:-- 测试STATUS消息(前边多了两个--)message(NOTICE 测试NOTICE消息)# 输出:测试NOTICE消息(前边没有空格)message(DEPRECATION 测试DEPRECATION消息)# 输出: 测试DEPRECATION消息(前边多两个空格)message(AUTHOR_WARNING 测试AUTHOR_WARNING消息)# 输出: 测试AUTHOR_WARNING消息(前边多两个空格)message(WARNING 测试WARNING消息)# 输出: 测试WARNING消息(前边多两个空格)message(SEND_ERROR 测试SEND_ERROR消息)# 输出: 测试SEND_ERROR消息(前边有两个空格)message(FATAL_ERROR 测试FATAL_ERROR消息)# 输出: 测试FATAL_ERROR消息(前边有两个空格)

2.13 CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR

2.13.1 测试顶层 CMAKE SOURCE变量

CMAKE_SOURCE_DIR:顶层CMakeLists.txt 文件所在的目录,根目录。
PEOJECT_SOURCE_DIR : 最近调用Project() 命令所在CMakeLists.txt目录
CMAKE_CURRENT_SOURCE_DIR : 当前正在处理的CMakeLists.txt 文件所在的目录
PROJECT_IS_TOP_LEVEL 最近调用的project() 命令是否位于顶层CMakeLists.txt文件中;
测试:

cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.1LANGUAGES CXX)# 测试 source 相关的变量# 测试是否为顶层cmakemessage("顶层 PROJECT_IS_TOP_LEVEL =${PROJECT_IS_TOP_LEVEL}")# 顶层 PROJECT_IS_TOP_LEVEL = ONmessage("CMAKE_SOURCE_DIR =${CMAKE_SOURCE_DIR}")# CMAKE_SOURCE_DIR = E:/cmakeLearning/chap2/8cmakesourcemessage("PROJECT_SOURCE_DIR =${PROJECT_SOURCE_DIR}")# PROJECT_SOURCE_DIR = E:/cmakeLearning/chap2/8cmakesourcemessage("sourceCmake_SOURCE_DIR =${sourceCmake_SOURCE_DIR}")# sourceCmake_SOURCE_DIR = E:/cmakeLearning/chap2/8cmakesourcemessage("CMAKE_CURRENT_SOURCE_DIR =${CMAKE_CURRENT_SOURCE_DIR}")# CMAKE_CURRENT_SOURCE_DIR = E:/cmakeLearning/chap2/8cmakesource

2.13.2 测试顶层BINARY相关变量

CMAKE_BINARY_DIR 顶层项目对应的二进制目录,即cmake -B 命令指定的一个名为build的目录;
PROJECT_BINARY_DIR :指向最近通过project() 命令定义的项目的对应的二进制目录;
项目名_BINARY_DIR : project(项目名) 命令对应的二进制目录;
CMAKE_CURRENT_BINARY_DIR :当前正在处理的项目对应的二进制目录;

message("CMAKE_BINARY_DIR =${CMAKE_BINARY_DIR}")# CMAKE_BINARY_DIR = E:/cmakeLearning/chap2/8cmakesource/buildmessage("PROJECT_BINARY_DIR =${CMAKE_BINARY_DIR}")# PROJECT_BINARY_DIR = E:/cmakeLearning/chap2/8cmakesource/buildmessage("CMAKE_CURRENT_BINARY_DIR =${CMAKE_CURRENT_BINARY_DIR}")# CMAKE_CURRENT_BINARY_DIR = E:/cmakeLearning/chap2/8cmakesource/build

2.14 CMAKE_CURRENT_LIST_FILE/DIR/LINE/FILE

下面的变量操作CMakeLists.txt 所在的目录。
CMAKE_CURRENT_LIST_FILE 当前正在处理的CMakeLists.txt文件或者脚本文件.cmake所在的完整路径。(路径+文件名)
CMAKE_CURRENT_LIST_DIR 当前正在处理的CMakeLists.txt文件所在的目录
CMAKE_CURRENT_LIST_LINE 当前正在处理的CMakeLists.txt文件内容的行号。
CMAKE_PARENT_LIST_FILE 在处理由 include() 或 find_package() 加载的 CMake脚本文件时,此变量显示它的父文件完整路径。

cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.2LANGUAGES CXX)# 正在处理的脚本的完整路径。message("CMAKE_CURRENT_LIST_FILE =${CMAKE_CURRENT_LIST_FILE}")# CMAKE_CURRENT_LIST_FILE = E:/cmakeLearning/chap2/9currentlist/CMakeLists.txt# 正在处理cmake所有目录message("CMAKE_CURRENT_LIST_DIR =${CMAKE_CURRENT_LIST_DIR}")# CMAKE_CURRENT_LIST_DIR = E:/cmakeLearning/chap2/9currentlist# 当前行号message("CMAKE_CURRENT_LIST_LINE =${CMAKE_CURRENT_LIST_LINE}")# CMAKE_CURRENT_LIST_LINE = 11# 父目录message("CMAKE_PARENT_LIST_FILE =${CMAKE_PARENT_LIST_FILE}")# CMAKE_PARENT_LIST_FILE = E:/cmakeLearning/chap2/9currentlist/CMakeLists.txt

2.15 CMake定义环境变量set( ENV{} )命令

CMake定义了环境变量来控制CMake的行为,设置的环境变量仅在当前CMAKE进程中生效,而不影响调用CMake的进行,也不影响整个系统环境,也不会影响后续构建或测试进程的环境。
定义环境变量:

set(ENV{变量名}[])

引用环境变量:

$ENV{变量名}

2.15.1 获取OS环境变量

获取当前的系统OS,获取OS的环境变量PATH,获取用户名USERNAME。

cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.2LANGUAGES CXX)# 获取OS的环境变量message("OS =$ENV{OS}")# OS = Windows_NTmessage("PATH =$ENV{PATH}")# 输出的环境变量在windows下是 PATH中的所有路径message("USERNAME =$ENV{USERNAME}")# USERNAME = Administrator

2.15.2 修改环境变量

修改系统的环境变量只对本文件有影响,对其他文件其他进程无影响。相当于于次临时修改。

set(ENV{PATH}"C:/Program")message(PATH=$ENV{PATH})# PATH=C:/Program

可以看出环境变量和普通变量是两个不同变量。

# 环境变量与普通变量区别set(ENV{CMAKE_INCLUDE_PATH}"C:\\Windows")set(CMAKE_INCLUDE_PATH"C:\\Users")message(环境变量CMAKE_INCLUDE_PATH=$ENV{CMAKE_INCLUDE_PATH})# 环境变量CMAKE_INCLUDE_PATH=C:\Windowsmessage(普通变量CMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH})# 普通变量CMAKE_INCLUDE_PATH=C:\Users

2.15.3 CMAKE内置环境变量

CMAKE_INCLUDE_PATH :使用此环境变量指定find_file()和 find_path()命令额外搜索的目录列表。 CMAKE_LIBRARY_PATH:使用此环境变量指定find_library()命令额外搜索的目录列表; CMAKE_PREFIX_PATH : 使用此环境变量指定查找已安装软件目录额外的前缀列表, find_program()命令会使用<prefix>/bin 搜索; find_library()命令会使用<prefix>/lib 搜索; find_file()命令会使用<prefix>/include 搜索。 CMAKE_PROGRAM_PATH :使用此变量指定find_program()命令额外的搜索目录列表;

测试:

message("CMAKE_INCLUDE_PATH =${CMAKE_INCLUDE_PATH}")# CMAKE_INCLUDE_PATH =message("CMAKE_LIBRARY_PATH =${CMAKE_LIBRARY_PATH}")# CMAKE_LIBRARY_PATH =message("CMAKE_PREFIX_PATH =${CMAKE_PREFIX_PATH}")# CMAKE_PREFIX_PATH =message("CMAKE_PROGRAM_PATH =${CMAKE_PROGRAM_PATH}")# CMAKE_PROGRAM_PATH =

2.15.4 编译时指定的变量

下面的生成器变量,编译类型变量和安装类型变量会影响普通变量。普通变量和环境变量会作为一个变量。
CMAKE_GENERATOR : 指定用于构建项目的生成器,比如Ninja, VS灯。
设置方法:

# 生成 Ninja 构建文件cmake -S.-B build -G"Ninja"# 生成 VS 2022 工程cmake -S.-B build -G"Visual Studio 17 2022"

CMAKE_BUILD_TYPE : 编译类型,需要设置默认值,比如Debug release类型。
编译类型:编译为Release版本。

cmake -S.-B build -DCMAKE_BUILD_TYPE=Release

实际项目使用:

if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug CACHE STRING"选择编译类型"FORCE)endif()message("CMAKE_BUILD_TYPE =${CMAKE_BUILD_TYPE}")# CMAKE_BUILD_TYPE = Debug

CMAKE_INSTALL_PREFIX(安装路径):使用此变量指定CMAKE_INSTALL_PREFIX,指定的值必须是绝对路径,指定软件安装的位置。
cmakeLists.txt中:

cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.2LANGUAGES CXX)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug CACHE STRING"选择编译类型"FORCE)endif()message("CMAKE_BUILD_TYPE =${CMAKE_BUILD_TYPE}")# CMAKE_BUILD_TYPE = Debugset(sourcecpp main.cpp)add_executable(sourceCmake${sourcecpp})install(TARGETS sourceCmake DESTINATION bin)// 安装目录

编译方式如下:

# 1 ,指定一个明确的绝对路径cmake -S.-B build -DCMAKE_INSTALL_PREFIX="E:/cmakeLearning/chap2/10env/install"# 2. 编译cmake --build build --config Release# 3 安装cmake --install build --config Release
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 7:34:01

Excalidraw监控告警设置:Prometheus对接教程

Excalidraw监控告警设置&#xff1a;Prometheus对接教程 在现代技术团队中&#xff0c;可视化协作工具早已不是“锦上添花”的辅助软件&#xff0c;而是产品设计、系统建模和远程协同的核心基础设施。Excalidraw 以其极简的手绘风格和出色的实时协作能力&#xff0c;逐渐成为开…

作者头像 李华
网站建设 2026/2/3 19:33:05

基于Excalidraw的远程头脑风暴解决方案全揭秘

基于Excalidraw的远程头脑风暴解决方案全揭秘 在分布式团队日益成为主流工作模式的今天&#xff0c;一场技术评审会可能涉及北京的产品经理、深圳的前端工程师、巴黎的UI设计师和旧金山的后端架构师。如何让这群身处不同时区的人&#xff0c;在没有白板、粉笔和擦痕满布的投影幕…

作者头像 李华
网站建设 2026/2/11 7:57:04

17、Windows 网络使用全攻略

Windows 网络使用全攻略 在日常上网过程中,我们常常会遇到离线浏览、使用不同浏览器、搜索网页以及收发电子邮件等需求。下面将为大家详细介绍在 Windows 系统中如何高效地完成这些操作。 离线浏览的方法 离线浏览时,通常有两种主要方式进行本地网页浏览: - 访问收藏夹…

作者头像 李华
网站建设 2026/2/4 4:09:32

Excalidraw开源镜像部署教程:快速搭建团队白板

Excalidraw开源镜像部署教程&#xff1a;快速搭建团队白板 在远程办公成为常态的今天&#xff0c;一个简单却高效的可视化协作工具&#xff0c;往往能决定一次技术讨论是高效推进还是陷入混乱。你是否经历过这样的场景&#xff1a;线上会议中&#xff0c;有人试图用PPT讲解系统…

作者头像 李华
网站建设 2026/2/4 1:38:36

Excalidraw绘图支持时间轴模式,展示演进过程

Excalidraw绘图支持时间轴模式&#xff0c;展示演进过程 在一次产品复盘会议上&#xff0c;团队争论不休&#xff1a;三年前的架构决策到底是谁提出的&#xff1f;为什么当时没有引入缓存层&#xff1f;翻遍文档库和会议纪要&#xff0c;依然找不到清晰脉络。这并非个例——当系…

作者头像 李华
网站建设 2026/2/8 4:55:52

Excalidraw结合LLM生成token的智能绘图工作流

Excalidraw结合LLM生成token的智能绘图工作流 在一场紧张的产品评审会上&#xff0c;产品经理刚讲完系统架构设想&#xff0c;工程师便在白板上点击几下&#xff0c;一张清晰的微服务调用图已跃然屏上——这不是科幻场景&#xff0c;而是如今借助Excalidraw与大语言模型&#x…

作者头像 李华