我如何设置一个特定的目标具体的编译器标志使用CMake的特定生成配置?(How can I set

2019-06-23 17:14发布

我有一个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()

然而,这总是选择发行版本( /MD ),当我查询生成类型(的message上述电话)我得到一个空字符串。 (我怀疑这是因为我使用Visual Studio生成;我见过不止一个参考,说CMAKE_BUILD_TYPE仅用于生成文件...)

如何设置这样进行编译每个目标的选择吗?

Answer 1:

在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>")

看到

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

对于更多关于CMAKE_BUILD_TYPE和几个原因发生器表达是更好(例如IMPORTED目标配置映射)。



Answer 2:

我知道这个方案是你的项目拆分成子目录在每个目标的基础,并使用唯一的选择add_subdirectory

根据项目目前是如何设置,这可能是一个痛苦的过程,我想。

其结果将是一个看起来像如顶级的CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
add_subdirectory(libB)
add_subdirectory(libA)
add_executable(main_exe "main.cpp")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
target_link_libraries(main_exe lib_a lib_b)

然后libA/CMakeLists.txt可以指定MDMDd标志:

project(LibA)
add_library(lib_a a.cpp a.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")

libB/CMakeLists.txtMTMTd标志:

project(LibB)
add_library(lib_b b.cpp b.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

当然,你可以添加所有·需要的目标链接到一个子目录的CMakeLists.txt和所有其他动态CRT那些静态CRT如果你有很多的目标。



Answer 3:

CMAKE_BUILD_TYPE仅适用于配置单生成。 多配置发生器(MSVC和Xcode中)可以构建用于在一个集结目录多种配置并且这样CMAKE_BUILD_TYPE标志不会有含义。

所述COMPILE_FLAGS目标属性不区分不同的配置(参见kitware错误追踪系统的更多信息)。

一个解决办法是有两个集结目录,类似于人们如何使用Makefile发电机,并建立二进制分发当定义一个额外的标志。 (即,发布配置)



文章来源: How can I set specific compiler flags for a specific target in a specific build configuration using CMake?