我正在尝试使用 clang++ 编译一些代码,但收到错误,例如无法找到 iostream。我知道 clang 默认使用 gcc 标头,因此当我使用 g++ 编译时一切都很好。有什么想法吗?我已经重新安装了所有内容,但问题仍然存在。
更新:现在仅适用于clang++ -lc++ Hello-world.cpp -o Hello-world
更新:
❯ clang++ -v -Wall -std=c++23 main.cpp -o main
Ubuntu clang version 18.1.8 (9ubuntu1~24.04)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/10
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
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/13
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14
Candidate multilib: .;@m64
Selected multilib: .;@m64
"/usr/lib/llvm-18/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -dumpdir main- -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 -debugger-tuning=gdb -fdebug-compilation-dir=/home/dejo -v -fcoverage-compilation-dir=/home/dejo -resource-dir /usr/lib/llvm-18/lib/clang/18 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++ -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/x86_64-linux-gnu -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/backward -internal-isystem /usr/lib/llvm-18/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wall -std=c++23 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -dwarf-debug-flags "/usr/lib/llvm-18/bin/clang --driver-mode=g++ -v -Wall -std=c++23 main.cpp -o main -dumpdir main-" -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/main-6edf0e.o -x c++ main.cpp
clang -cc1 version 18.1.8 based upon LLVM 18.1.8 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/backward"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++
/usr/lib/llvm-18/lib/clang/18/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
1 | #include <iostream>
| ^~~~~~~~~~
1 error generated.
卸载所有旧版本的 clang 并安装最新版本。
结果
clang++ --version
应该是:将以下 C++ 代码保存在 Hello-world.cpp 中。
使用以下方法编译
clang++ Hello-world.cpp -o Hello-world
使用以下代码运行编译后的代码
./Hello-world
我在 x64 上运行时遇到了同样的问题。上面建议的解决方法适用于 aarch64,但由于其他原因,在这里不起作用。
但是我确实了解到,如果我特别安装 g++-14,我的 hello world clang++ 就会真正构建并运行。似乎是 clang 包没有正确捕获其依赖项。
我同意这真是太糟糕了。我认为 Canonical 不会发布一个主要版本的系统,而一个常见、重要、使用良好的软件包却像这样损坏。我错了。
该系统对我来说目前无法使用,我会离开,直到它正常工作。或者我会继续使用 Mint。如果其他人想让他们的 clang 在此期间真正工作,只需发布此信息即可。
我遇到了同样的事情,因为我需要使用 clang/++ 来编译 Emacs lsp-mode。
好的。
哇喔!!!
sudo apt install libstdc++-14-dev
去修复。https://packages.ubuntu.com/search?keywords=libstdc%2B%2B-14-dev&searchon=names&suite=noble§ion=all
Clang 使用 gcc 标头https://clangd.llvm.org/guides/system-headers 因此,无论 24.04 是否附带 gcc14 或非开发版本的 gcc14 的占位符,我都不知道。
警告:今天刚发现,Nvidia 驱动程序在将系统设置为 clang/++ 时无法很好地运行,因此我认为一般不建议这样做。
要检查:
设置
如果您构建系统使用 c/c++ 的系统环境变量(例如 CMake),
有人建议
export
使用-DCMAKE...
编译器标志。看起来合法。PS 我不记得是否必须做任何符号链接。
ln -s ... ...