Cmake:针对multi-config cmake项目的特定配置特定设置

rSi*_*Sir 5 c++ cmake multi-configuration visual-studio-2015

Cmake新手在这里,我目前正在尝试将仅使用单一配置开发的cmake项目转换为可以生成visual studio文件的多配置项目.

我无法解决的问题是,在cmake项目中存在依赖于变量CMAKE_BUILD_TYPE的逻辑,例如:

set(ENABLE_DEBUG TRUE)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
  set(ENABLE_DEBUG FALSE)
)
Run Code Online (Sandbox Code Playgroud)

由于对于多配置cmake,CMAKE_BUILD_TYPE为空,这种方式不起作用.然后变量ENABLE_DEBUG在cmake项目中用于以下内容:

案例1:添加库仅调试配置

if(ENABLE_DEBUG)
  list(APPEND LIB_SRC src/lib_debug.cpp)
endif()
add_library(LIB OBJECT LIB_SRC)
Run Code Online (Sandbox Code Playgroud)

情况2:将预处理程序标志添加到仅调试配置

if(ENABLE_DEBUG)
  add_definitions(...)
endif()
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有人为上述一个或两个案例都有一个解决办法,可以用于多配置cmake项目,即我可以指定库添加和预处理器标志,而不依赖于CMAKE_BUILD_TYPE变量.或者更好的是,如果有一个特定于配置的方式设置ENABLE_DEBUG而不依赖于CMAKE_BUILD_TYPE变量?

Tsy*_*rev 5

在CMake中,多配置构建工具的特定于配置的设置的常用方法是使用生成器表达式.

命令add_library允许对源文件使用生成器表达式.例如:

add_library(mylib common.c $<$<CONFIG:DEBUG>:debug.c>)
Run Code Online (Sandbox Code Playgroud)

创建一个图书馆组成,从common.c所有的配置再加上额外debug.c调试配置.

add_definitions的文档没有注意到生成器表达式的用法,但是target_compile_definitions的文档确实:

target_compile_definitions(mylib PUBLIC $<$<CONFIG:DEBUG>:-DDEBUG_VAR>)
Run Code Online (Sandbox Code Playgroud)