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 中常用的宏:
参考自:来自 爱编程的大丙!