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

Mat*_*lpa 4 c++ cmake sfml

一点背景知识:我正在 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
}
Run Code Online (Sandbox Code Playgroud)

我对 CMake 世界比较陌生,所以我什至不知道这是否可能。

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

ixS*_*Sci 6

这就是您通常可以这样做的方式(适用于任何生成器):

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

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

因此,应用上述所有内容,我们得到这样的结果:

add_compile_definitions("DEBUG=$<CONFIG:Debug>")
add_executable(${PROJECT_NAME} main.cpp)
Run Code Online (Sandbox Code Playgroud)