如何在运行cmake时将gcc替换为g++-11 for C++20

uqjltbpv  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(160)

规格:

  • 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.

还是不行。我现在毫无头绪。

pgpifvop

pgpifvop1#

让CMake使用另一个C++编译器的一种快速且非侵入性的方法是设置CXX环境变量:
正如CMake documentation解释的那样,结果是缓存的,所以在运行上面的行以应用更改之前,您需要删除CMakeCache.txt(或整个构建目录)。
要运行的命令可能如下所示:

rm -rf build
export CXX=/usr/bin/g++-12
cmake -S . -B build

缓存也可能是您之前尝试失败的原因。
顺便说一句,设置C编译器的步骤是一样的,只需要使用CC环境变量。

djmepvbi

djmepvbi2#

gcc/g是编译器,11.4.0是编译器的版本,而不是语言的版本
C
20是一个C标准
这两件事是不同的
你需要改变cmake(CMakeLists.txt)来使用不同的c
标准,就像这样:

set(CMAKE_CXX_STANDARD 20)

或者不使用这些功能

相关问题