如何在 C++ 中检查当前的 CMake 构建类型?

How to check for current CMake build type in C++?

一些背景知识:我正在用 SFML 编写游戏,我希望在发布版本中省略某些代码行。我想在编译时检查构建类型,这样不会影响游戏的性能。

void Tile::draw(sf::RenderTarget& target, sf::RenderStates states) const {
    states.transform *= getTransform();
    target.draw(m_sprite, states);
    #if(DEBUG)
        target.draw(m_collision_shape, states);
    #endif
}

我是 CMake 世界的新手,所以我什至不知道它是否可行。

编辑: 可能值得一提的是我使用 ninja 作为构建系统。

在您的代码中添加来自 cmake 的宏:

// CMakeLists.txt
add_executable(your_game yoru_soruces.c)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_compile_definitions(your_game PRIVATE DEBUG=1)
else()
    target_compile_definitions(your_game PRIVATE DEBUG=0)
endif()

您也可以改用标准宏 NDEBUG#if !NDEBUG,但最好将其仅用于断言。 NDEBUG 没有为 CMAKE_BUILD_TYPE=Debug 构建定义。

通常情况下您可能会这样做(适用于任何生成器):

add_executable(${PROJECT_NAME} main.cpp)
target_compile_definitions(${PROJECT_NAME} PRIVATE "DEBUG=$<IF:$<CONFIG:Debug>,1,0>")

如果每个目标都需要它,您可以在顶部 CMake 文件中使用以下内容(如果您有多个 add_subdirectory)和 before(它是不是必需的,但它不那么混乱)你创建了一个目标。正如 Alex Reinking 正确纠正的那样,我们可以使用更简单的条件,因为 $<CONFIG:Debug> 已经给出 10.

所以应用上面描述的一切我们得到这样的东西:

add_compile_definitions("DEBUG=$<CONFIG:Debug>")
add_executable(${PROJECT_NAME} main.cpp)