1、自定义宏
在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制这些 代码是否生效,如下所示:
#include <iostream>
#define NUMBER 5
int main()
{
int a = 10, b = 2;
#ifdef DEBUG
std::cout << "这是一行调试信息";
#ifdef MAXN
std::cout << ", MAXN = " << MAXN;
#else
std::cout << ", MAXN没有被定义";
#endif
std::cout << std::endl;
#endif
for(int i = 0;i < NUMBER;i++){
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
-
在程序中对
DEBUG
宏进行判断:- 如果该宏被定义了,那么会进行调试输出
- 如果没有定义这个宏,这段代码就相当于被注释掉了,因此最终无法看到日志输出
-
为了让测试更灵活,我们可以不再代码中定义这个宏,而是在测试的时候去把它定义出来,其中就可以通过
g++/gcc
命令去指定g++ main.cpp -o main -DDEBUG -DMAXN=5
-D
:表示植入宏DEBUG
:宏名字MAXN
:宏名字,=5
表示植入该宏的值
在CMake中我们也可以做类似的事情,对应的命令叫做add_definitions
# add_definitions(-D宏名称1 -D宏名称2=宏值)
cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)
project(test)
# 植入DEBUG宏
add_definitions(-DDEBUG)
# 植入MAXN宏
add_definitions(-DMAXN=10)
add_executable(main main.cpp)
# 输出
# 只植入DEBUG宏
# 这是一行调试信息, MAXN没有被定义
# 0 1 2 3 4
# 只植入MAXN宏或者不植入
# 0 1 2 3 4
# 植入DEBUG宏、MAXN宏
# 这是一行调试信息, MAXN = 10
# 0 1 2 3 4
2、预定义宏
常用的CMake内置宏
常用的CMake宏变量 | 含义 |
---|---|
CMAKE_PROJECT_NAME | 当前项目的名称 |
PROJECT_NAME | 最近通过project()命令激活的项目名称。 |
CMAKE_C_COMPILER | C编译器的完整路径 |
CMAKE_CXX_COMPILER | C++编译器的完整路径 |
CMAKE_BUILD_TYPE | 指定构建类型(比如Release或Debug) |
CMAKE_SOURCE_DIR | 项目的顶层源目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的目录 |
CMAKE_BINARY_DIR | 项目的顶层构建目录 |
CMAKE_CURRENT_BINARY_DIR | 当前处理的CMakeLists.txt对应的构建目录 |
CMAKE_INSTALL_PREFIX | 安装目录前缀 |
CMAKE_MODULE_PATH | 指定额外的CMake模块搜索路径 |
CMAKE_PREFIX_PATH | 用于查找库文件的路径前缀 |
编译器和工具设置 | |
CMAKE_C_FLAGS | C编译器的命令行选项 |
CMAKE_CXX_FLAGS | C++编译器的命令行选项 |
CMAKE_VERBOSE_MAKEFILE | 如果为TRUE,构建过程将显示更多的信息 |
项目宏 | |
PROJECT_SOURCE_DIR | 包含最顶层CMakeLists.txt文件的目录,即项目的源代码根目录 |
PROJECT_BINARY_DIR | 项目的构建目录,如果是外部构建,这将与CMAKE_BINARY_DIR不同 |
PROJECT_VERSION | 通过project()命令设置的项目版本 |
PROJECT_VERSION_MAJOR | 项目的主版本号 |
PROJECT_VERSION_MINOR | 项目的次版本号 |
PROJECT_VERSION_PATCH | 项目的补丁版本号 |
PROJECT_VERSION_TWEAK | 项目的微调版本号(如果指定) |
PROJECT_DESCRIPTION | 项目的描述信息(需要CMake 3.9及以上版本) |
PROJECT_HOMEPAGE_URL | 项目的主页URL(需要CMake 3.12及以上版本) |
系统信息 | |
CMAKE_SYSTEM | 系统名称,例如Linux-5.4.0-150-generic |
CMAKE_SYSTEM_NAME | 不包含版本的系统名称,如Linux、Windows |
CMAKE_SYSTEM_PROCESSOR | 目标系统的处理器架构,例如x86_64 |
以上只是一些常见的宏的具体的使用手册,还有一些宏可能没有列举出来。