news 2026/6/10 16:04: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/6/10 15:12:51

Excalidraw图形语义识别能力发展潜力分析

Excalidraw图形语义识别能力发展潜力分析 在敏捷开发节奏日益加快的今天&#xff0c;一个产品需求从会议室讨论到技术方案落地&#xff0c;往往卡在“如何快速可视化表达”这一环。设计师手绘草图不够规范&#xff0c;工程师用Visio又太重&#xff0c;而PPT画架构图更是耗时费…

作者头像 李华
网站建设 2026/6/10 15:37:55

Excalidraw深度集成AI后,绘图效率提升了多少?

Excalidraw深度集成AI后&#xff0c;绘图效率提升了多少&#xff1f; 在技术团队的日常协作中&#xff0c;你是否经历过这样的场景&#xff1f;产品经理在会议里描述一个“用户下单流程”&#xff0c;大家点头称是&#xff0c;但等到真正画架构图时&#xff0c;却发现每个人脑海…

作者头像 李华
网站建设 2026/6/10 9:54:31

Python中CORS 跨域中间件的配置和作用原理

一、先定位是什么&#xff1a;CORS&#xff08;Cross-Origin Resource Sharing&#xff09;跨域资源共享&#xff0c;是由浏览器和服务端共同遵循的、规范跨域 HTTP 请求行为的安全机制。它的核心作用是在浏览器 “同源策略” 的安全框架下&#xff0c;允许服务端通过配置响应头…

作者头像 李华
网站建设 2026/6/9 15:52:46

Excalidraw是否支持离线使用?PWA功能评测

Excalidraw 是否支持离线使用&#xff1f;PWA 功能深度评测 在如今这个远程协作常态化、信息碎片化加剧的时代&#xff0c;一个能随时打开、快速记录灵感的数字白板&#xff0c;几乎成了每位技术人员的“电子便签”。而当会议突然开始、地铁钻入隧道、或者身处没有Wi-Fi的会议…

作者头像 李华
网站建设 2026/6/10 15:41:17

Excalidraw issue响应速度与bug修复周期统计

Excalidraw issue响应速度与bug修复周期统计 在开源项目的世界里&#xff0c;一个仓库的“活跃度”往往不是看 star 数或 fork 量&#xff0c;而是藏在那些不起眼的细节中——比如你提了一个 issue 后&#xff0c;多久才有人回你&#xff1f;一个 bug 被报告后&#xff0c;要等…

作者头像 李华
网站建设 2026/6/10 6:32:58

夸克限速_网盘解析

今天教大家一招能解决夸克网盘限制的在线工具。这个工具也是完全免费使用的。下面让大家看看我用这个工具的下载速度咋样。地址获取&#xff1a;放在这里了&#xff0c;可以直接获取 这个速度还是不错的把。对于平常不怎么下载的用户还是很友好的。下面开始今天的教学 输入我给…

作者头像 李华