使用Clang++编译代码时报如上所述的错误,原因是Clang只是一个“前端编译器”,它不自带完整的底层运行时库和启动代码,在Linux平台上必须依赖GCC的工具链来完成最终的程序生成。
Clang驱动会扫描/usr/lib/gcc/x86_64-linux-gnu/目录下的所有子目录(如11、12),并选择一个最新的版本,因此clang++ -v -x c++ /dev/null -o /dev/null的输出可以看到:
... Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12...基于选中的版本(12),Clang会去/usr/include/c++/12搜索type_traits文件,但找不到,因为在某些系统中没有安装版本12的开发头文件包(libstdc++-12-dev),所以/usr/include/c++/12目录根本不存在。
虽然/usr/include/c++/11和/usr/include/c++/11/type_traits都存在,但由于Clang选中的版本是12,因此就不会去/usr/include/c++/11中搜索type_traits文件;
综上所述,解决这个编译报错的方法是:sudo apt install libstdc++-12-dev。