You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu22.04下Clang找不到libstdc++但libc++可用,clangd LSP异常

Ubuntu22.04下Neovim使用clangd找不到iostream头文件的解决方法

问题背景

操作系统:Ubuntu22.04
目标:在Neovim中使用clangd作为LSP
问题:无法找到头文件iostream,已生成compile_commands.json但无效。测试Clang时发现,直接编译或指定-stdlib=libstdc++均提示找不到iostream,但指定-stdlib=libc++可正常编译运行。

相关命令输出

compile_commands.json内容

[
{
  "directory": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake",
  "command": "/usr/bin/cc -DSOME_DEFINITION   -o CMakeFiles/my_app.dir/CMakeFiles/3.22.1/CompilerIdC/CMakeCCompilerId.c.o -c /home/stoair/cPlusPlus/c++/learn/testLSP/cmake/CMakeFiles/3.22.1/CompilerIdC/CMakeCCompilerId.c",
  "file": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake/CMakeFiles/3.22.1/CompilerIdC/CMakeCCompilerId.c"
},
{
  "directory": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake",
  "command": "/usr/bin/c++ -DSOME_DEFINITION  -std=gnu++17 -o CMakeFiles/my_app.dir/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp.o -c /home/stoair/cPlusPlus/c++/learn/testLSP/cmake/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp",
  "file": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp"
},
{
  "directory": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake",
  "command": "/usr/bin/cc -DSOME_DEFINITION   -o CMakeFiles/my_app.dir/main.c.o -c /home/stoair/cPlusPlus/c++/learn/testLSP/main.c",
  "file": "/home/stoair/cPlusPlus/c++/learn/testLSP/main.c"
},
{
  "directory": "/home/stoair/cPlusPlus/c++/learn/testLSP/cmake",
  "command": "/usr/bin/c++ -DSOME_DEFINITION  -std=gnu++17 -o CMakeFiles/my_app.dir/main.cpp.o -c /home/stoair/cPlusPlus/c++/learn/testLSP/main.cpp",
  "file": "/home/stoair/cPlusPlus/c++/learn/testLSP/main.cpp"
}
]

Clang编译测试

$ clang++ -o main main.cpp 
main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
$ clang++ -o main main.cpp -stdlib=libstdc++ 
main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
$ clang++ -o main main.cpp -stdlib=libc++
$ ./main
hello world!

版本及详细日志

$ clang -v
Ubuntu clang version 14.0.0-1ubuntu1.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda-12.1, version
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
$ clang++ -o main main.cpp -stdlib=libstdc++ -v
Ubuntu clang version 14.0.0-1ubuntu1.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda-12.1, version 
 "/usr/lib/llvm-14/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/home/stoair/cPlusPlus/c++/learn/testLSP -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -I/usr/local/cuda-12.1/targets/x86_64-linux/lib -I/usr/local/cuda-12.1/targets/x86_64-linux/include -I. -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++ -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/x86_64-linux-gnu -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/backward -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir=/home/stoair/cPlusPlus/c++/learn/testLSP -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/main-93e0e4.o -x c++ main.cpp
clang -cc1 version 14.0.0 based upon LLVM 14.0.0 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/backward"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/cuda-12.1/targets/x86_64-linux/lib
 /usr/local/cuda-12.1/targets/x86_64-linux/include
 .
 /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++
 /usr/lib/llvm-14/lib/clang/14.0.0/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
$ clang++ -o main main.cpp -stdlib=libc++ -v
Ubuntu clang version 14.0.0-1ubuntu1.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda-12.1, version 
 "/usr/lib/llvm-14/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/home/stoair/cPlusPlus/c++/learn/testLSP -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -I/usr/local/cuda-12.1/targets/x86_64-linux/lib -I/usr/local/cuda-12.1/targets/x86_64-linux/include -I. -internal-isystem /usr/lib/llvm-14/bin/../include/c++/v1 -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir=/home/stoair/cPlusPlus/c++/learn/testLSP -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/main-077ebf.o -x c++ main.cpp
clang -cc1 version 14.0.0 based upon LLVM 14.0.0 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/cuda-12.1/targets/x86_64-linux/lib
 /usr/local/cuda-12.1/targets/x86_64-linux/include
 .
 /usr/lib/llvm-14/bin/../include/c++/v1
 /usr/lib/llvm-14/lib/clang/14.0.0/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
 "/usr/bin/ld" -pie --hash-style=both --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main /lib/x86_64-linux-gnu/Scrt1.o /lib/x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/12/crtbeginS.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/12 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/usr/lib/llvm-14/bin/../lib -L/lib -L/usr/lib /tmp/main-077ebf.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib/gcc/x86_64-linux-gnu/12/crtendS.o /lib/x86_64-linux-gnu/crtn.o

问题分析

从clang编译日志可以看出:当指定-stdlib=libstdc++时,clang自动选择了GCC 12的安装路径,但系统实际安装的g版本是11,且GCC 12的libstdc++开发包未安装,导致clang找不到标准库头文件。而使用-stdlib=libc++时,clang能正确定位到LLVM自带的libc头文件目录,因此编译正常。

解决方案

方案1:安装GCC 12的libstdc++开发包

执行以下命令安装缺失的头文件:

sudo apt update && sudo apt install libstdc++-12-dev

安装完成后,clang可通过GCC 12的路径找到libstdc++头文件,无需额外参数即可正常编译,clangd也能正确识别头文件。

方案2:修改CMake配置,强制使用libc++

若倾向于使用libc++,可修改项目CMakeLists.txt,添加以下配置:

# 指定编译器为clang++
set(CMAKE_CXX_COMPILER clang++)
# 添加编译参数,使用libc++
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
# 添加链接参数,
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:01:42