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

标签 c++ visual-c++ cmake

我有一个 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 仅适用于 makefile...)

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

最佳答案

在 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 目标配置映射)。

关于c++ - 如何使用 CMake 在特定构建配置中为特定目标设置特定编译器标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199904/

相关文章:

c++ - TerminateProcess 和死锁

c++ - 在 `h` 中使用标签 `hh` 或 `printf` 是否涉及未定义的行为?

C++运行时错误?如何解决这个问题并检查?

c++ - B-Tree节点 split 技术

visual-c++ - Xinput 不适用于带有 Visual Studio 2012 的 Windows 7

c++ - 如何在MSVC中禁止所有第三方编译时间警告

CMake 找不到库

c++ - 发布版本的应用程序抛出 c1083 无法打开包含文件错误

android-ndk - android cmakelist 添加多源文件?

android - 在运行时加载多个共享库在 Android 中不起作用