【发布时间】:2013-02-18 09:36:16
【问题描述】:
我想在 C++11 中创建一个项目,并使用 CMake 作为我的构建系统。
如何在 CMake 配置文件中添加所需的最低编译器版本?
【问题讨论】:
标签: cmake
我想在 C++11 中创建一个项目,并使用 CMake 作为我的构建系统。
如何在 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_compile() 验证编译器是否支持您需要的功能,如果不支持,则使用FATAL_ERROR。它在 CMake 中更加惯用,并且具有额外的好处,您不必为所有编译器找到合适的最小版本。
【讨论】:
std::regex 使用是否编译所花费的时间与编译整个(小)项目的时间相当。有时检查版本对开发人员来说更简单,对编译项目的用户来说更快。
target_compile_features() 用于检查特定的编译功能。但是可以用它检查的功能数量有限。
从 CMake 2.8.10 开始,用户可以访问 CMAKE_
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()
【讨论】:
现在有内置支持。来自Documentation:
target_compile_features(mylib PUBLIC cxx_std_11)
"在本例中,CMake 将确保编译器以至少 C++ 11(或 C++ 14、C++ 17,...)的模式调用,必要时添加 -std=gnu++11 等标志。这适用于mylib 中的源以及任何依赖项(可能包括来自 mylib 的标头)。”
【讨论】: