WSL下g++编译含<chrono>/<thread>头文件时出现内部编译错误
WSL下编译C++程序触发GCC内部段错误问题
在WSL环境编译C++多线程程序时遇到GCC内部段错误,具体表现及排查情况如下:
问题复现代码1(多线程程序)
#include <thread> void f() {} int main() { std::thread t(f); t.join(); return 0; }
编译错误信息
In file included from /usr/include/c++/9/chrono:40, from /usr/include/c++/9/thread:38, from test.cpp:1: /usr/include/c++/9/limits:1665:7: internal compiler error: Segmentation fault 1665 | min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MIN__; } | ^~~ 0x7f7d7a46b08f ??? /build/glibc-SzIz7B/glibc-2.31/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0 0x7f7d7a44c082 __libc_start_main ../csu/libc-start.c:308
简化复现代码(仅包含)
进一步测试发现,仅引入<chrono>头文件的空程序也会触发相同错误:
#include <chrono> int main() { return 0; }
已尝试的无效操作
- 使用
-pthread -std=c++17参数编译 - 更新并重新安装g++
可行排查/解决方向
- 切换到WSL2:WSL1对部分Linux工具兼容性较差,执行
wsl --set-version <分发版名称> 2切换(需先启用WSL2系统功能) - 清理GCC缓存:删除
~/.cache/gcc目录,避免缓存损坏导致编译异常 - 升级系统分发版:比如将Ubuntu 20.04升级到22.04,获得更高版本的GCC(9.x→11.x),修复已知编译器bug
- 检查磁盘空间:确保WSL挂载的磁盘有足够剩余空间,避免编译时缓存写入失败
- 替换编译器:尝试用clang编译,命令为
clang++ test.cpp -o test -pthread -std=c++17
内容的提问来源于stack exchange,提问作者White Eagle
相关产品推荐
相关产品推荐

