Cmake 如何添加所需的最低编译器版本?

Cmake 如何添加所需的最低编译器版本?,cmake,Cmake,我想在C++11中创建一个项目,并使用CMake作为构建系统 如何在CMake配置文件中添加所需的最低编译器版本?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"

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


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

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\u compile()
验证编译器是否支持您需要的功能,如果不支持,则使用
FATAL\u ERROR
。它在CMake中更为惯用,并且具有额外的好处,您不必为所有编译器找到合适的最小版本。

从CMake 2.8.10开始,用户可以访问CMake\uu编译器版本变量以获得编译器版本。在以前的版本中,这些仅保留用于内部目的,不应由用户代码读取。它们也不能保证为所有语言设置,但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()

您可以按如下方式检查特定的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()

虽然更加惯用,但我发现测试
std::regex
用法是否编译所需的时间与编译整个(小型)项目所需的时间相当。有时,检查版本对于开发人员来说更简单,对于编译项目的用户来说更快。还需要检查特定的编译功能。但可以用它检查的功能数量有限。请参见下面@Steve Lorimer的答案:这似乎是对问题的正确答案。虽然这个问题不是我真正拥有的问题,但这个答案给了我我所需要的答案。