WSL2 Debian9下GCC12编译C++17找不到charconv头文件如何解决
排查修复步骤
- 首先确认C编译器实际版本:你之前查的是
gcc(C语言编译器)的版本,C代码编译调用的是g++,先执行g++ -v看输出版本,如果显示的是6.x版本(Debian 9默认源自带版本),说明系统默认调用的还是老编译器,根本没用到你装的GCC 12。 - 检查GCC 12的C头文件是否完整:执行
ls /usr/local/include/c++/12.1.0/charconv,如果提示文件不存在,说明你当初源码编译GCC时没有开启C语言前端,需要重新进入GCC源码目录编译安装,configure步骤加上参数--enable-languages=c,c++,其余配置保持不变即可。 - 配置编译器指向新装的GCC 12,二选一即可:
- 全局生效方案:执行以下命令替换系统默认的gcc、g++软链接
执行完重新跑sudo mv /usr/bin/gcc /usr/bin/gcc.bak sudo mv /usr/bin/g++ /usr/bin/g++.bak sudo ln -s /usr/local/bin/gcc /usr/bin/gcc sudo ln -s /usr/local/bin/g++ /usr/bin/g++g++ -v,确认输出版本为12.1.0即可。 - 仅当前项目生效方案:不用改全局配置,在CMakeLists.txt的
project()命令之前添加两行显式指定编译器路径:
也可以在执行cmake命令时通过参数传入编译器路径:set(CMAKE_C_COMPILER /usr/local/bin/gcc) set(CMAKE_CXX_COMPILER /usr/local/bin/g++)cmake .. -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++
- 全局生效方案:执行以下命令替换系统默认的gcc、g++软链接
- 清理CMake缓存重新编译:之前生成的CMake缓存会记录老的编译器路径,必须删除后重新配置。进入项目的build目录执行:
rm -rf ./* cmake .. make -j$(nproc)
补充说明:
<charconv>是C17新增的标准库头,GCC从8版本开始支持整数相关的<charconv>接口,11版本补全了浮点转换相关接口,你安装的GCC 12.1完全支持该头文件的所有功能,只要确保编译时调用的是对应版本的g,就不会再出现找不到头文件的报错。
内容的提问来源于stack exchange,提问作者ishaangupte
相关产品推荐
相关产品推荐

