如何使用CMake为特定构建配置中的特定目标设置特定的编译器标志?

Bil*_*eal 16 c++ cmake visual-c++

我有一个CMakeLists,我想使用C运行时的动态版本和使用静态版本的一些其他目标来构建一些目标.

因为需要为每个目标设置,所以默认的设置方法CMAKE_CXX_FLAGS_<Config>不起作用; 这覆盖了所有目标.

为此,我尝试了以下内容:

# @fn       set_target_dynamic_crt
# @brief    Sets the given target to use the dynamic version of the CRT (/MD or
#           /MDd)
# @param    ...  A list of targets to which this setting should be applied.
function( set_target_dynamic_crt )
    if ( MSVC )
        message (WARNING ${CMAKE_BUILD_TYPE})
        if (CMAKE_BUILD_TYPE STREQUAL "Debug")
            set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MDd" )
        else()
            set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MD" )
        endif()
    endif()
endfunction()
Run Code Online (Sandbox Code Playgroud)

但是,这总是选择发布版本(/MD),当我查询构建类型(message上面的调用)时,我得到空字符串.(我怀疑这是因为我使用的是Visual Studio生成器;我看过不止一个引用CMAKE_BUILD_TYPE只是为了makefile ...)

如何为每个目标设置这样的编译选项?

ste*_*ire 31

在CMake 2.8.12中,我添加了一个target_compile_options命令来满足这个需求:

http://public.kitware.com/Bug/view.php?id=6493

http://www.cmake.org/cmake/help/git-master/manual/cmake-generator-expressions.7.html

target_compile_options(tgt PRIVATE "/MD$<$<CONFIG:Debug>:d>")
Run Code Online (Sandbox Code Playgroud)

看到

http://www.cmake.org/cmake/help/git-next/manual/cmake-buildsystem.7.html#build-specification-with-generator-expressions

有关CMAKE_BUILD_TYPE的更多信息以及生成器表达式更好的几个原因(例如,IMPORTED目标配置映射).


phb*_*phb 0

CMAKE_BUILD_TYPE仅对单配置生成器有效。多配置生成器(MSVC 和 Xcode)可以在一个构建目录中构建多个配置,因此该CMAKE_BUILD_TYPE标志没有意义。

COMPILE_FLAGS 目标属性不区分不同的配置(有关更多信息,请参阅kitware bugtracker)。

解决方法是有两个构建目录,类似于人们使用 Makefile 生成器的方式,并在构建用于分发的二进制文件时定义一个附加标志。(即Release配置)