8. 宏定义
在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制这些代码是否生效。
如下所示,新建一个文件 test.cpp
#include <iostream>
int main() {
int num = 42;
#ifdef DEBUG
std::cout << "这是一个DEBUG信息" << '\n';
#endif
std::cout << num << '\n';
return 0;
}
我们编译时候加上我们定义了的宏:
g++ -Wall -DDEBUG main.cpp -o main
然后运行:
./main
这是一个DEBUG信息
42
在 CMake 中也有这种功能:
add_definitions(-D宏名称1 [<-D宏名称2> ...])
刚才的 main.cpp 代码所在的工程目录结构:
.
├── CMakeLists.txt
└── main.cpp
0 directories, 2 files
我的 CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(M_DEBUG_TEST)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_COMPILER g++)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_definitions(-DDEBUG)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
add_executable(main ${SRC})
编译运行:
mkdir build && cd build
cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yuzu/cmake_proj/proj7/build
make
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable ../bin/main
[100%] Built target main
../bin/main
这是一个DEBUG信息
42
要在使用 cmake 构建环境的时候启用代码中定义的宏,可以在 CMakeLists.txt 中添加相关的宏定义,然后直接构建。
预定义的宏
宏 | 功能 |
---|---|
PROJECT_SOURCE_DIR |
最近一次调用 project 的 CMakeLists.txt 所在的源码目录 |
PROJECT_BINARY_DIR |
执行 cmake 命令的目录 |
CMAKE_CURRENT_SOURCE_DIR |
当前处理的 CMakeLists.txt 所在的路径 |
CMAKE_CURRENT_BINARY_DIR |
target 编译目录 |
EXECUTABLE_OUTPUT_PATH |
重新定义目标二进制可执行文件的存放位置 |
LIBRARY_OUTPUT_PATH |
重新定义目标链接库文件的存放位置 |
CMAKE_PROJECT_NAME |
返回通过 PROJECT 指令定义的项目名称 |
CMAKE_BINARY_DIR |
项目实际构建路径,假设在 build 目录进行的构建,那么得到的就是这个目录的路径 |