规格:
- WSL,Ubuntu 22.04
- cmake版本3.25.2
- g++版本:11.4.0
- gcc版本:11.4.0
我在做斯坦福大学2023年 Spring 的CS 144的实验室0时,我在一开始就卡住了。当我运行cmake --build build
时,我得到了以下错误消息:
error: invalid return type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} of ‘constexpr’ function ‘static constexpr std::string ExpectationViolation::boolstr(bool)’
16 | static constexpr std::string boolstr( bool b ) { return b ? "true" : "false"; }
我在互联网上发现,这是因为constexpr std::string
是在C++ 20中引入的,而我的wsl上有gcc-11和g++-11,而gcc-11只支持C++ 20的一些实验性功能。所以我打算将Cmake的默认编译器设置为g++。但是,我总是收到同样的错误消息。
我试着安装g++-12:
lrwxrwxrwx 1 root root 21 Sep 27 21:24 /usr/bin/g++ -> /etc/alternatives/g++*
lrwxrwxrwx 1 root root 23 May 13 15:52 /usr/bin/g++-11 -> x86_64-linux-gnu-g++-11*
lrwxrwxrwx 1 root root 23 May 13 15:33 /usr/bin/g++-12 -> x86_64-linux-gnu-g++-12*
lrwxrwxrwx 1 root root 21 Sep 27 21:46 /usr/bin/gcc -> /etc/alternatives/gcc*
lrwxrwxrwx 1 root root 23 May 13 15:52 /usr/bin/gcc-11 -> x86_64-linux-gnu-gcc-11*
lrwxrwxrwx 1 root root 23 May 13 15:33 /usr/bin/gcc-12 -> x86_64-linux-gnu-gcc-12*
lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-ar -> gcc-ar-11*
lrwxrwxrwx 1 root root 26 May 13 15:52 /usr/bin/gcc-ar-11 -> x86_64-linux-gnu-gcc-ar-11*
lrwxrwxrwx 1 root root 26 May 13 15:33 /usr/bin/gcc-ar-12 -> x86_64-linux-gnu-gcc-ar-12*
lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-nm -> gcc-nm-11*
lrwxrwxrwx 1 root root 26 May 13 15:52 /usr/bin/gcc-nm-11 -> x86_64-linux-gnu-gcc-nm-11*
lrwxrwxrwx 1 root root 26 May 13 15:33 /usr/bin/gcc-nm-...
没成功然后我试着建立一个软链接:
sudo update-alternatives --config gcc
There is only one alternative in link group gcc (providing /usr/bin/gcc): /usr/bin/g++-11
Nothing to configure.
sudo update-alternatives --config g++
There is only one alternative in link group g++ (providing /usr/bin/g++): /usr/bin/g++-11
Nothing to configure.
还是不行。我现在毫无头绪。
2条答案
按热度按时间pgpifvop1#
让CMake使用另一个C++编译器的一种快速且非侵入性的方法是设置
CXX
环境变量:正如CMake documentation解释的那样,结果是缓存的,所以在运行上面的行以应用更改之前,您需要删除
CMakeCache.txt
(或整个构建目录)。要运行的命令可能如下所示:
缓存也可能是您之前尝试失败的原因。
顺便说一句,设置C编译器的步骤是一样的,只需要使用
CC
环境变量。djmepvbi2#
gcc/g是编译器,11.4.0是编译器的版本,而不是语言的版本
C 20是一个C标准
这两件事是不同的
你需要改变cmake(CMakeLists.txt)来使用不同的c标准,就像这样:
或者不使用这些功能