【问题标题】:How can I add a minimum compiler version requisite?如何添加所需的最低编译器版本?
【发布时间】:2013-02-18 09:36:16
【问题描述】:

我想在 C++11 中创建一个项目,并使用 CMake 作为我的构建系统。

如何在 CMake 配置文件中添加所需的最低编译器版本?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    AFAIK,没有对此类内容的内置支持,但您当然可以自己编写:

    if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.gcc.version")
        message(FATAL_ERROR "Insufficient gcc version")
      endif()
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
      if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.msvc.version")
        message(FATAL_ERROR "Insufficient msvc version")
      endif()
    elseif(...)
    # etc.
    endif()
    

    但是,我建议您实际上考虑使用特征检测方法。也就是说,使用try_compile() 验证编译器是否支持您需要的功能,如果不支持,则使用FATAL_ERROR。它在 CMake 中更加惯用,并且具有额外的好处,您不必为所有编译器找到合适的最小版本。

    【讨论】:

    • 虽然更惯用,但我发现测试 std::regex 使用是否编译所花费的时间与编译整个(小)项目的时间相当。有时检查版本对开发人员来说更简单,对编译项目的用户来说更快。
    • 还有target_compile_features() 用于检查特定的编译功能。但是可以用它检查的功能数量有限。
    • 查看下面@Steve Lorimer 的回答:这似乎是问题的正确答案。
    • 虽然这个问题不是我真正遇到的问题,但这个答案给了我需要的答案。
    【解决方案2】:

    从 CMake 2.8.10 开始,用户可以访问 CMAKE__COMPILER_VERSION 变量以获取编译器版本。在以前的版本中,这些仅保留用于内部目的,不应由用户代码读取。也不能保证为所有语言设置它们,但 C 和 CXX 绝对应该可用。

    CMake 还包含可用于编写版本验证代码的版本比较运算符(VERSION_LESS、VERSION_EQUAL、VERSION_GREATER)。

    请记住,您需要先找出您拥有的编译器,然后检查正确的版本。

    这是我的一个项目中的一个简短示例:

    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        # require at least gcc 4.8
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
            message(FATAL_ERROR "GCC version must be at least 4.8!")
        endif()
    elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
        # require at least clang 3.2
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2)
            message(FATAL_ERROR "Clang version must be at least 3.2!")
        endif()
    else()
        message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.")
    endif()
    

    【讨论】:

      【解决方案3】:

      可以查看具体gcc版本如下:

      if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
          message(FATAL_ERROR "Require at least gcc-5.1")
      endif()
      

      【讨论】:

        【解决方案4】:

        现在有内置支持。来自Documentation

        target_compile_features(mylib PUBLIC cxx_std_11)

        "在本例中,CMake 将确保编译器以至少 C++ 11(或 C++ 14、C++ 17,...)的模式调用,必要时添加 -std=gnu++11 等标志。这适用于mylib 中的源以及任何依赖项(可能包括来自 mylib 的标头)。”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-05
          • 2018-02-27
          • 2015-04-11
          • 2017-03-01
          • 1970-01-01
          相关资源
          最近更新 更多