#ifdef与CMake独立于平台的DEBUG

时间:2011-12-21 14:54:41

标签: c++ c cmake

我正在使用CMake在Windows(Visual Studio)以及Linux机器(gcc)上构建我的项目。我想将一些代码标记为“仅调试”,例如

#ifdef DEBUG
//some logging here
#endif

问题是:CMake“Debug”构建类型中的所有平台上都有哪些编译器定义? DEBUG似乎不存在。 (我希望只有在构建类型为Debug时才能进行日志记录。)

3 个答案:

答案 0 :(得分:86)

CMake默认将-DNDEBUG添加到CMAKE_C_FLAGS_ {RELEASE,MINSIZEREL}。因此,您可以使用#ifndef NDEBUG

答案 1 :(得分:21)

我建议您添加自己的定义。 CMake符号CMAKE_C_FLAGS_DEBUG可以包含仅在调试模式下使用的标志。例如:

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

(也许,你必须使用"/DMY_DEBUG"用于visual studio。)

答案 2 :(得分:8)

在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>")

请注意,Visual C ++的最新版本(至少自VS2015起)允许使用/或-作为参数,因此它在编译器之间应能正常工作。此命令对于您可能想要添加的其他编译选项也很有用(对于MSVC,在发布模式下为“ / O2”,对于G ++ / Clang,在发布模式下为“ -O3”)

[1]:注意:在CMake> = 3.12(当前为beta)中,还有一个add_compile_definitions支持生成器表达式,该表达式会影响所有目标。