CMake学习(6): 打印日志信息及宏定义

news2024/11/15 17:56:50

1. message 打印日志

介绍CMake中的调试打印命令Message, 可以为用户显示一条消息,并在终端上打印显示。假如,我们通过File命令对文件进行了搜索,但是不能确定搜索到的文件就是我们需要的文件。此时,可以利用message将搜索到的变量值打印出来, 非常方便我们调试。

message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)

第一个参数:指明输出的消息的重要程度,也就是消息的别;第二个参数为需要输出的消息字符串或者变量

消息的级别

  • (无) :重要消息
  • STATUS :非重要消息
  • WARNING:CMake 警告,会继续执行
  • AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
  • SEND_ERROR:CMake 错误,继续执行,但是会跳过生成的步骤
  • FATAL_ERROR:CMake 错误,终止所有处理过程

注意: FATAL_ERROR是一个严重的错误,输出该错误信息后,程序就会终止。

CMake 的命令行工具会在 stdout 上显示 STATUS 消息,在 stderr 上显示其他所有消息。CMake 的 GUI 会在它的 log 区域显示所有消息。

CMake 警告和错误消息的文本显示使用的是一种简单的标记语言。文本没有缩进,超过长度的行会回卷,段落之间以新行做为分隔符。

# 输出一般日志信息
message(STATUS "source path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "source path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")

案例

cmake_minimum_required(VERSION 3.15)
project(test)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) 
set(EXECUTABLE_OUTPUT_PATH  /home/yws/aa/bb/cc)
inlude_directories(${PROJECT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
message("xxxxxxxxxxxxxxxxx")
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
add_executable(app ${SRC})
message(STATUS "1111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
target_link_libraries(
message(FATAL_ERROR  "222xxxxxxxxxxxxxxxxxxxxxxxx")
message(STATUS "3333xxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
cd build
cmake ..

可以看到在执行完 FATAL_ERROR信息就中断了,因为FATAL ERROR是一条非常严重的错误,cmake 执行完该条错误就会中断,所以message "333xxxxxxxxxxxxxx"信息不会被执行。

2. Cmake中的宏定义

2.1 宏定义

在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制这些代码是否生效,如下所示:

  • 当我们在项目开发期间,为了进行程序测试,会在代码里面做大量的日志输出,比如通过fprintf,printf,cout等做日志输出。
  • 当项目开发完后,调试没有debug时,我们要发布这个程序的时候,就需要把代码中所有调试信息删除掉。因为程序如果有大量的日志输出,它会影响执行效率。
  • 假设我们项目1000个源文件,每个源文件有100条日志输出,那么在删除日志的时候,其实是非常痛苦并且繁琐的。
  • 解决方案:可以通过定义宏,来控制日志是否输出
#include <stdio.h>
#define NUMBER  3

int main()
{
    int a = 10;
#ifdef DEBUG
    printf("我是一个程序猿, 我不会爬树...\n");
#endif
    for(int i=0; i<NUMBER; ++i)
    {
        printf("hello, GCC!!!\n");
    }
    return 0;
}

在程序的第七行对 DEBUG 宏进行了判断,如果该宏被定义了,那么第八行就会进行日志输出,如果没有定义这个宏,第八行就相当于被注释掉了,因此最终无法看到日志输入出(上述代码中并没有定义这个宏)。

为了让测试更灵活,我们可以不在代码中定义这个宏,而是在测试的时候去把它定义出来,其中一种方式就是在 gcc/g++ 命令中去指定,如下:

gcc test.c -DDEBUG -o app

gcc/g++ 命令中通过参数-D指定出要定义的宏的名字,这样就相当于在代码中定义了一个宏,其名字为 DEBUG

CMake中我们也可以做类似的事情,对应的命令叫做 add_definitions:

add_definitions(-D宏名称)

针对于上面的源文件编写一个 CMakeLists.txt,内容如下:

cmake_minimum_required(VERSION 3.0)
project(TEST)
# 自定义 DEBUG 宏
add_definitions(-DDEBUG)
add_executable(app ./test.c)

通过这种方式,上述代码中的第八行日志就能够被输出出来了。

2.2 预定义宏

下面的列表中为大家整理了一些 CMake 中常用的宏:
在这里插入图片描述
参考自:来自 爱编程的大丙!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS 套索选区工具(2) 多边形套索工具 磁性套索工具使用技巧

上文PS 套索选区工具(1) 套索工具基础使用带大家了解了套索工具的基本操作 这边 我们右键套索工具 它还有个 多边形套索工具 多边形套索工具是用来画直线的 我们选中它 然后 我们鼠标点击一下 然后 移动到指定位置 从你点的位置开始 到结束的地方 就会形成一个直线的选区 点…

SpringBoot项目编译运行时提示“程序包xxx不存在,找不到符号”

今天想要在虚拟机上部署自己的前后端项目&#xff0c;在系统打包时碰到了这个问题&#xff0c;记录一下 1. 项目结构&#xff0c;启动程序再pub-oa-web项目中 2、编译异常报错分析 编译中报错是在其他子项目中都配置了如下代码&#xff0c;导致项目每个子项目都是可执行的&am…

第五章数组

我们之前学习&#xff0c;如果我们存储一个值&#xff08;或者说只有一个值在改变&#xff09;那么我们使用变量&#xff1b; 但是如果我们需要存储多个值&#xff0c;因该怎么办呢&#xff01; 1 数组 1.1 概念 数组Array&#xff0c;标志是[ ] ,用于储存多个相同类型数据的集…

JDBC 连接池 详解(通俗易懂)

目录 一、前言 二、传统连接方式的弊端分析 1.局限性 : 2.几个弊端 : 三、数据库连接池 1.基本介绍 : 2.示意图如下 : 3.连接池种类 : 四、C3P0连接池 0.准备工作 : 1.方式一 —— 程序中指定相关参数 : 2.方式二 —— 通过配置文件 : 五、Druid&#xff08;德鲁伊…

Vue中如何进行路由懒加载

Vue中如何进行路由懒加载 路由懒加载是一种优化Vue应用程序性能的技术。它可以延迟加载路由组件&#xff0c;从而减少应用程序的初始加载时间&#xff0c;提高应用程序的性能。本文将介绍Vue中如何进行路由懒加载&#xff0c;包括使用Vue异步组件和Webpack代码分割。 使用Vue异…

Docker本地私有仓库、harbor私有仓库部署与管理

目录 一、本地私有仓库1、本地私有仓库简介2、搭建本地私有仓库3、容器重启策略介绍 二、harbor私有仓库部署与管理1、什么是harbor2、Harbor的特性3、Harbor的构成4、harbor部署及配置①部署docker-compose②部署Harbor服务③登录创建项目④登录仓库并上传镜像 5、客户端测试①…

Python 基于 Django 的学生成绩管理系统,可视化界面

1简介 对于学生成绩管理系统&#xff0c;充分运用现代化的信息技术手段&#xff0c;对于学生成绩信息管理发展的趋势就是信息化&#xff0c;信息化时代下的信息管理&#xff0c;需要深化信息管理体制与手段的改革&#xff0c;充分运用信息化手段来全方位的进行学生成绩管理系统…

Vue中如何进行数据响应式更新?

Vue中如何进行数据响应式更新&#xff1f; Vue是一款流行的JavaScript框架&#xff0c;它提供了数据响应式更新的能力&#xff0c;可以让我们轻松地更新数据&#xff0c;并自动更新视图。本文将介绍Vue中如何进行数据响应式更新&#xff0c;包括使用Vue的响应式系统、使用计算…

nacos-sdk-rust binding for Python

广告时间 nacos-sdk-rust-binding-py : nacos-sdk-rust binding for Python with PyO3. Tip: nacos-sdk-python 仓库暂未提供 2.x gRPC 交互模式&#xff0c;为了能升级它&#xff0c;故而通过 ffi 方式调用 nacos-sdk-rust py 包 -> https://pypi.org/project/nacos-sdk-r…

【Java代码的运行过程】 ——每天一点小知识

&#x1f4a7; J a v a 代码的运行过程 \color{#FF1493}{Java代码的运行过程} Java代码的运行过程&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏…

Vue中如何处理日期与时间

Vue中如何处理日期与时间 日期和时间处理是Web应用中常见的需求&#xff0c;Vue作为一款流行的前端框架&#xff0c;提供了很多方便的工具和库&#xff0c;以满足不同业务场景下的需求。本文将介绍如何在Vue中处理日期和时间&#xff0c;包括使用原生JavaScript、Moment.js和D…

useMemo和useCallback

上述代码中&#xff0c;useSate 用于定义了三个状态&#xff1a;supNum、oppNum、x。在组件函数中&#xff0c;我们根据这些状态来计算投票的支持率&#xff0c;并将其渲染到视图中。但是&#xff0c;每次状态变化时&#xff0c;投票支持率的计算都会重新执行&#xff0c;即使其…

c++深搜1-迷宫类问题

目录 1.问题引入 2.知识讲解 3.例题解析 【例题1】迷宫的第一条出路。 题目描述 输入格式 输出格式 样例 输入数据#1 输出数据#1 输入数据#2 输出数据#2 【例题2】迷宫的所有路径。 【例题3】走出迷宫的最少步数。 1.问题引入 拓拓小时候玩迷宫游戏时&#xff…

小酷智慧地图3D导公众号小程序 v1.0.50+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 小酷智慧地图3D导览系统适用于城市或乡镇全…

性能测试之全链路压测实战理论详解

目录 前言 01为什么需要全链路压测&#xff1f; 02全链路压测解决了哪些问题&#xff1f; 03哪些业务场景适合做 04基础技术组件 05小结 前言 要说当下研发领域最热门的几个词&#xff0c;全链路压测 肯定跑不了。最近的几次大会上&#xff0c;也有不少关于全链路的议题。…

Vue项目中使用MapboxGL开发3D地图教程(一)MapboxGL介绍以及前期vue项目的搭建

MapboxGL介绍以及前期vue项目的搭建 1、Mapbox-gl简介2、搭建vue项目2.1、创建vue项目2.2、注册mapbox官网2.3、mapbox-gl入门案例 3、Mapbox-gl地图主要配置参数说明 1、Mapbox-gl简介 Mapbox-gl是一个开源、基于webgl技术的前端地图类库。 地图数据渲染和可视化这块我们经常用…

第七章 详细设计

结构化程序设计的基本结构包括 顺序结构、选择结构、循环结构 三种。 详细设计层 详细设计概览 详细设计的任务&#xff1a;定义每一模块 三种控制结构&#xff1a;顺序、选择、循环 伪码 伪码是一种混合语言。外 部采用形式语言定义控制 结构和数据结构&#xff0c;内部使…

OpenGL光照之投光物

文章目录 平行光点光源衰减实现衰减 聚光手电筒平滑/软化边缘完整代码 我们目前使用的光照都来自于空间中的一个点。它能给我们不错的效果&#xff0c;但现实世界中&#xff0c;我们有很多种类的光照&#xff0c;每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light…

算法提高-图论- 最小生成树的扩展应用

最小生成树的扩展应用 最小生成树的扩展应用AcWing 1146. 新的开始AcWing 1145. 北极通讯网络AcWing 346. 走廊泼水节AcWing 1148. 秘密的牛奶运输 最小生成树的扩展应用 AcWing 1146. 新的开始 利用虚拟源点建图和原题的题意是等价的&#xff0c;因此我们使用虚拟源点建图套…

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器&#xff0c;防止机…