我正在使用CMake在Windows(Visual Studio)以及Linux机器(gcc)上构建我的项目。我想将一些代码标记为“仅调试”,例如
#ifdef DEBUG
//some logging here
#endif
问题是:CMake“Debug”构建类型中的所有平台上都有哪些编译器定义? DEBUG似乎不存在。 (我希望只有在构建类型为Debug时才能进行日志记录。)
答案 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
支持生成器表达式,该表达式会影响所有目标。