33

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

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

4

4 回答 4

52

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 中更加惯用,并且具有额外的好处,您不必为所有编译器找到合适的最小版本。

于 2013-02-18T10:51:03.987 回答
25

从 CMake 2.8.10 开始,用户可以访问 CMAKE_<LANG>_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()
于 2013-08-22T00:29:18.037 回答
9

可以查看具体的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()
于 2016-08-23T21:29:56.743 回答
0

现在有内置的支持。从文档

target_compile_features(mylib PUBLIC cxx_std_11)

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

于 2022-01-14T15:36:56.577 回答