CMake启用C++11报错:特性未知问题求助(CMake3.5.1+Ubuntu16.04)
解决CMake 3.5.1启用C++11时“this feature is unknown”错误
你遇到的问题大概率是因为你的CMakeLists.txt里用了仅在CMake 3.8及以上版本才支持的C++标准启用方式,而Ubuntu 16.04自带的CMake 3.5.1不兼容这个写法。
常见错误原因
如果你的代码里用了类似下面的写法,CMake 3.5.1会识别不了cxx_std_11这个特性,从而抛出“this feature is unknown”错误:
target_compile_features(your_target PRIVATE cxx_std_11)
cxx_std_11是CMake 3.8才引入的特性,老版本(3.5.1)根本不认识它。而其他设备的CMake版本更高(比如3.8+),所以能正常解析。
针对CMake 3.5.1的解决方案
这里有两种稳妥的方式来启用C++11:
方案1:直接传递编译器参数(最兼容老版本)
Ubuntu 16.04自带的GCC 5.4完全支持C++11,所以可以直接给编译器传递-std=c++11参数:
# 在项目初始化后添加 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
或者用add_compile_options统一添加:
add_compile_options(-std=c++11)
方案2:使用CMake标准变量(CMake 3.1+支持,3.5.1可用)
CMake 3.1及以上支持用CMAKE_CXX_STANDARD变量来指定C++标准,写法如下:
set(CMAKE_CXX_STANDARD 11) # 强制要求编译器支持C++11,否则报错 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 可选:禁用GNU扩展,使用纯标准C++11(避免自动启用-std=gnu++11) set(CMAKE_CXX_EXTENSIONS OFF)
注意这里的变量值是数字11,不是字符串"c++11",老版本CMake对字符串形式的支持可能有问题。
验证方法
修改完CMakeLists.txt后,重新执行:
mkdir build && cd build cmake ..
如果没有再抛出“this feature is unknown”的错误,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Vic Tor
相关产品推荐
相关产品推荐

