CMake知道std 20,但g++9不知道

lf3rwulv  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(292)

我有一个项目,它不能编译的研究员,由于一个未知的调用方法从标准库。
我怀疑这是由于那个家伙的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中添加的?

50pmv0ei

50pmv0ei1#

如果你的编译器是GCC 9.5.0,CMake说它不知道C23的原因是因为它不知道?
https://en.cppreference.com/w/cpp/compiler_support
cppreference.com的编译器支持表中唯一指出GCC v9“知道”C
23的是“* 缩小static_assertconstexpr 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

if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 9.1)
  set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x")
  set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
endif()

Modules/Compiler/GNU-CXX.cmake

elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0)
  set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
  set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
endif()
jum4pzuy

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.makebuild.ninja(取决于您使用的生成器)。

相关问题