我正在使用CMake在Windows(Visual Studio)和Linux机器(gcc)上构建我的项目。我想将一些代码标记为“仅调试”,例如:
#ifdef DEBUG
//some logging here
#endif
问题是:在CMake的“Debug”构建类型中,所有平台都可以使用哪个编译器定义?DEBUG似乎不存在。(我希望只在构建类型为Debug时才记录日志或进行其他操作。)
我正在使用CMake在Windows(Visual Studio)和Linux机器(gcc)上构建我的项目。我想将一些代码标记为“仅调试”,例如:
#ifdef DEBUG
//some logging here
#endif
问题是:在CMake的“Debug”构建类型中,所有平台都可以使用哪个编译器定义?DEBUG似乎不存在。(我希望只在构建类型为Debug时才记录日志或进行其他操作。)
CMake默认会在CMAKE_C_FLAGS_{RELEASE, MINSIZEREL}中添加-DNDEBUG
,因此您可以使用#ifndef NDEBUG
。
CMake
符号 CMAKE_C_FLAGS_DEBUG
可以包含仅在调试模式下使用的标志。例如:
C
:
C
:
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DMY_DEBUG")
C++
:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_DEBUG")
在你的代码中,你可以写如下内容:
#ifdef MY_DEBUG
// ...
#endif
(也许你需要在Visual Studio中使用"/DMY_DEBUG"
。)
NDEBUG
由CMake定义,所以这更可取。 - Kyle StrandNDEBUG
是C标准定义的一个符号,用于控制assert()
函数是否应该被激活。个人认为你不应该将其用于其他任何目的。(感谢对用户名的赞美。) - LindydancerNDEBUG
。至于正确的添加宏定义的方法(现在至少是这样),应该是add_definitions(-DMY_DEBUG)
。文档建议识别-
或/
作为前缀,因此它应该是与操作系统无关的。 - user1236508CMAKE_BUILD_TYPE
等的if
开关。为了贡献一些有用的东西,我已经确认add_definition
将解析“-”和“/”,但手动set
标志则不会。 - user1236508在 CMake >= 2.8 中,请使用 target_compile_definitions
命令:
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")
在调试模式下编译,这将为您的代码定义DEBUG符号。即使在像Visual Studio和Xcode这样的IDE中,也会工作,因为Cmake为所有编译模式生成单个文件。
您必须为每个目标执行此操作 [1]。或者,您可以使用add_compile_options
(Cmake >=3.0):
add_compile_options("$<$<CONFIG:DEBUG>:-DDEBUG>")
CMakeLists.txt
中使用了以下内容:set(IS_DEBUG_BUILD CMAKE_BUILD_TYPE STREQUAL "Debug")
# Indication to the code that this is a debug build
if (${IS_DEBUG_BUILD})
add_compile_definitions(__DEBUG__)
endif ()
#ifdef __DEBUG__
// blablabla
#edif
我的最低 CMake
版本:
cmake_minimum_required(VERSION 3.16.3)