我有一个项目,它不能编译的研究员,由于一个未知的调用方法从标准库。
我怀疑这是由于那个家伙的g ++版本(9.4.2),因为这个函数是在std 20标准中添加的,为了测试是否是这样,我安装了g ++-9(9.5.0版),并将/usr/bin/g++
符号链接指向g ++-9,偶然发现了另一个问题(问题)。
当我奔跑
$ g++-9 -std=c++20
g++-9: error: unrecognized command line option ‘-std=20’; did you mean ‘-std=c2x’?
g++-9: fatal error: no input files
compilation terminated.
我得到一个错误,说明std标准版本20未知。
但是当我尝试在CMakeLists.txt
中使用以下行为cmake项目生成构建文件时:
target_compile_features(${PROJECT_NAME}
PUBLIC
cxx_std_20
)
我没有得到错误。但是当用23替换20时:
target_compile_features(${PROJECT_NAME}
PUBLIC
cxx_std_23
)
我得到了错误
CMake Error at CMakeLists.txt:74 (target_compile_features):
target_compile_features The compiler feature "cxx_std_23" is not known to
CXX compiler
"GNU"
version 9.5.0.
为什么C++20标准对g ++来说是未知的,但在用cmake生成构建文件时却是已知的?
这是一种跟进问题:
当我试图编译我的项目时,我得到了错误:
error: ‘std::stringstream’ {aka ‘class std::__cxx11::basic_stringstream<char>’} has no member named ‘view’
和view was added in c++20。会不会是,那个视图不是在c ++2a中添加的?
2条答案
按热度按时间50pmv0ei1#
如果你的编译器是GCC 9.5.0,CMake说它不知道C23的原因是因为它不知道?
https://en.cppreference.com/w/cpp/compiler_support
cppreference.com的编译器支持表中唯一指出GCC v9“知道”C23的是“* 缩小
static_assert
和constexpr if
中的上下文转换 ”而你得到“g++-9:错误:无法识别的命令行选项“-std= 20”;您的意思是'-std= c2 x'?”对于GCC 9.5.0来说可能只是因为C20支持还没有完全实现。请查看cppreference.com中的编译器支持表。GCC直到版本10才实现了许多C20的核心语言特性和库特性(有些甚至在版本9-13中实现,例如“ 带填充位的原子比较和交换 *”)
因此,只要按照它告诉你的去做,并接受你所得到的,接受并不是所有的C++20特性都能在GCC 9.5.0中获得。
或者升级你的编译器:P
它之所以能与CMake的
target_compile_features(... cxx_std_20)
一起工作,是因为...... CMake处理它。参见Modules/Compiler/GNU-C.cmake:
和Modules/Compiler/GNU-CXX.cmake:
jum4pzuy2#
标准C++20到GCC 9的选项名称为
-std=c++2a
。根据man gcc
:c 2a
ISO C标准的下一个修订版,计划于2020年发布。支持是高度实验性的,在未来版本中几乎肯定会以不兼容的方式进行更改。
因此,并不是所有的功能都可以预期在那里。
GCC有为尚未发布的标准或不完全支持的标准提供别名的传统。GCC 9只知道
c++2a
,而这在GCC 10中变成了c++20
的别名。CMake可以处理这个问题。如果不确定CMake使用什么作为标准(或任何其他选项),请查看构建目录中的
flags.make
或build.ninja
(取决于您使用的生成器)。