如果你想知道为什么这是必要的,这是因为cmake不是一个构建系统。它是一个元构建系统(即构建构建系统的构建系统)。这基本上是处理在一次构建中支持多个配置的构建系统的结果。如果你想更深入地了解cmake,我建议你阅读Craig Scott的书《Professional cmake: a Practical Guide》
我如何使用CMake指定调试和释放C/ c++标志?
现代的实践是利用目标的和属性。
这里有一个例子:
add_library(foobar)
# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
$<$<CONFIG:Debug>:
FOOBAR_DEBUG=1
>
)
注意:我如何使用生成器表达式来指定配置!
使用CMAKE_BUILD_TYPE将导致任何多配置生成器的错误构建!< / p >
此外,有时你需要全局设置,而不仅仅是一个目标。
使用add_compile_definitions, add_compile_options等。这些函数支持生成器表达式。不要使用旧风格的cmake,除非你不得不(那是一个噩梦的土地)