如何在 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>
已经给出 1
或 0
.
所以应用上面描述的一切我们得到这样的东西:
add_compile_definitions("DEBUG=$<CONFIG:Debug>")
add_executable(${PROJECT_NAME} main.cpp)
一些背景知识:我正在用 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>
已经给出 1
或 0
.
所以应用上面描述的一切我们得到这样的东西:
add_compile_definitions("DEBUG=$<CONFIG:Debug>")
add_executable(${PROJECT_NAME} main.cpp)