2013-02-18 27 views

回答

37

据我所知,没有内置这样的事情的支持,但你当然可以把它写自己:

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中更具惯用性,并且还有额外的好处,您不必为那里的所有编译器发现适当的最小版本。

+0

虽然更地道,我发现,测试是否' std :: regex'用法编译需要花费时间来编译整个(小)项目。有时检查版本对于开发人员来说更简单,而且对于编译项目的用户来说更快。 – Ruslan 2016-06-29 14:16:55

21

从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() 
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() 
相关问题