如何在CMake中将gcc替换为g++-11以支持C++20(WSL Ubuntu环境)
解决CS144 Lab0编译错误:
constexpr std::string不支持问题 环境配置
- WSL, Ubuntu 22.04
- CMake版本:3.25.2
- g++版本:11.4.0
- gcc版本:11.4.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是C20引入的特性,gcc-11仅支持部分实验性C20特性,因此需要升级到gcc-12,但配置默认编译器时遇到问题。
问题根源
已安装gcc-12/g++-12,但未将其添加到update-alternatives的备选列表中,导致系统默认仍使用gcc-11。
解决步骤
1. 将gcc-12和g++-12添加到alternatives
执行以下命令,为gcc和g++添加新版本的备选(优先级100确保高于默认的gcc-11):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
2. 切换默认编译器
再次执行配置命令,此时会出现可选版本,选择对应gcc-12和g++-12的编号:
sudo update-alternatives --config gcc sudo update-alternatives --config g++
3. 验证编译器版本
执行命令确认切换成功:
gcc --version g++ --version
输出应显示版本为12.x.x。
4. 重新构建项目
删除原有build目录,重新执行CMake配置和构建:
rm -rf build cmake -S . -B build cmake --build build
替代方案:直接在CMake中指定编译器
如果不想修改系统默认编译器,可在CMake配置时直接指定gcc-12:
cmake -S . -B build -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 cmake --build build
内容的提问来源于stack exchange,提问作者Overstacked
相关产品推荐
相关产品推荐

