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++") # 添加链接参数,
相关产品推荐
相关产品推荐

