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

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 
#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 中常用的宏:
CMake学习(6): 打印日志信息及宏定义_第1张图片
参考自:来自 爱编程的大丙!

你可能感兴趣的:(C++,学习,java,开发语言)