【问题标题】:CMake: add conditional compiler flags into Visual Studio projectCMake:将条件编译器标志添加到 Visual Studio 项目中
【发布时间】:2020-06-22 23:35:28
【问题描述】:

Visual Studio 允许选择cl 编译器或clang-cl 编译器来构建项目——这些被称为工具集。这两个编译器具有不同的标志集,特别是用于禁用警告的不同标志。一个编译器的标志会在另一个编译器上产生错误。

通过基于使用的工具集定义编译器标志conditionally,可以同时在两个编译器的 Visual Studio 中解决此问题。 here的官方文档。

我使用 CMake 生成 Visual Studio 项目。如何让 CMake 为生成的 Visual Studio 项目添加此类条件标志?

【问题讨论】:

    标签: c++ visual-studio cmake


    【解决方案1】:

    您可以将CMAKE_CXX_COMPILER_IDCMAKE_CXX_SIMULATE_ID 与您最喜欢的编译器处理方式(if-else 或生成器表达式)一起使用

    -T ClangCL (Visual Studio 2019) 的输出:

    message(STATUS ${CMAKE_CXX_COMPILER_ID}) // Clang
    message(STATUS ${CMAKE_CXX_SIMULATE_ID}) // MSVC
    

    没有工具包的输出(Visual Studio 2019):

    message(STATUS ${CMAKE_CXX_COMPILER_ID}) // MSVC
    message(STATUS ${CMAKE_CXX_SIMULATE_ID}) // <empty>
    

    【讨论】:

    • CMAKE_CXX_SIMULATE_ID 真的很有用;我不知道存在。我用它来为 clang-cl 设置分支。一个奇怪的细节是 if (NOT ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")) 按预期工作,但 if (NOT (${CMAKE_CXX_SIMULATE_ID} STREQUAL "MSVC")) 没有(总是如此)。
    • @kaba 当CMAKE_CXX_SIMULATE_ID 未定义(空)时会发生这种情况。第二个条件应该产生错误。只需使用if (NOT (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
    【解决方案2】:

    对于较早的问题here,本质上是一种更现代的方法,您可以使用 if 语句来检查编译器类型,并基于此设置编译标志:

    if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
        # Disable a Clang warning type.
        target_compile_options(MyLib PRIVATE -Wno-unused-variable)
    elseif(MSVC)
        # Disable a MSVC warning type.
        target_compile_options(MyLib PRIVATE /wd4101)
    endif()
    

    要将其放入单个表达式中,您可以使用 CMake generator expressions(在 CMake 构建系统生成阶段进行评估):

    target_compile_options(MyLib PRIVATE 
        "$<IF:$<STREQUAL:${CMAKE_CXX_COMPILER_ID},Clang>,-Wno-unused-variable,/wd4101>"
    )
    

    作为参考,这里是所有 clang 警告类型的 list

    【讨论】:

    • 我已经有了这些编译器特定的开关。问题中的问题有点不同:在 Visual Studio 项目设置中切换时,相同生成的 Visual Studio 项目必须能够同时为 cl 和 clang-cl 工作,而无需通过 CMake 重新生成项目。
    • @kaba 如果你正在切换编译器/工具集,CMake 真的应该重新运行。
    • 我明白了。如果 MSBuild 条件无法正常工作,我可以处理。
    • @kaba 我还添加了一个生成器表达式方法,它可能更接近您想要实现的目标。
    • 我同意重新运行 CMake 比依赖特殊的 MSBuild 功能更好。
    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多