在Clang++中找到iostream:致命的错误:没有找到'iostream'文件

16 人关注

我写了以下简单的C++程序。

#include <iostream>
using namespace std;
int main() {
    cout << "Hello, World" << endl;
    return 0;

当我用g++编译时,它工作得很好。当我试图用Clang++编译时,我得到以下错误。

main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

-v参数运行,我看到了以下情况。

ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/backward"
ignoring nonexistent directory "/include"
ignoring duplicate directory "/usr/include/clang/6.0.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++
 /usr/include/clang/6.0.0/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

逐一查看这些文件夹,我发现在/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++中(或者更简洁地说,在/usr/include/c++中)我有以下目录。

drwxr-xr-x   5 root root 4.0K Feb  4 09:38 .
drwxr-xr-x 101 root root  20K Feb  4 12:22 ..
drwxr-xr-x  12 root root  12K May 24  2018 5
drwxr-xr-x  12 root root  12K Oct  9 14:53 7
drwxr-xr-x   5 root root 4.0K Feb  4 09:38 v1
lrwxrwxrwx   1 root root    1 Apr 11  2018 5.5.0 -> 5
lrwxrwxrwx   1 root root    1 Apr 15  2018 7.3.0 -> 7

57v1的每个目录中,都存在一个名为iostream的文件。

/usr/include/x86_64-linux-gnu中也存在一个c++目录,它看起来和这个目录完全一样(有575.5.07.3.0目录)。

/usr/include中也存在一个c++目录,它看起来和上面的两个目录完全一样

我不知道我的开发环境是如何变得如此混乱的,但在这一点上,我只想知道如何修复它,使Clang++能够成功地找到这9个iostream的实例之一,而不是抛出一个错误,说它不存在。我是否需要添加一个环境变量来告诉Clang去哪里找?我是否需要传递一个命令行参数来告诉Clang进行递归搜索?

Update (1)

When I try building with libc++ I get the following error:

$> clang++ -stdlib=libc++ main.cpp
/usr/bin/ld: cannot find -lc++abi
clang: error: linker command failed with exit code 1 (use -v to see invocation)

当我尝试用手动覆盖的include路径进行构建时,我得到了以下错误。

$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 main.cpp
/usr/bin/ld: cannot find -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)

当我尝试这两种方法时,我得到了以下(难以置信的大)错误。

$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 -stdlib=libc++ main.cpp
In file included from main.cpp:1:
In file included from /usr/include/c++/7/iostream:39:
In file included from /usr/include/c++/7/ostream:38:
In file included from /usr/include/c++/7/ios:42:
In file included from /usr/include/c++/7/bits/ios_base.h:41:
In file included from /usr/include/c++/7/bits/locale_classes.h:40:
In file included from /usr/include/c++/7/string:52:
In file included from /usr/include/c++/7/bits/basic_string.h:6352:
In file included from /usr/include/c++/7/ext/string_conversions.h:41:
In file included from /usr/include/c++/7/cstdlib:77:
/usr/include/c++/7/bits/std_abs.h:56:3: error: declaration conflicts with target of using declaration already in scope
  abs(long __i) { return __builtin_labs(__i); }
/usr/include/c++/v1/stdlib.h:111:44: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY long      abs(     long __x) _NOEXCEPT {return  labs(__x);}
/usr/include/c++/7/bits/std_abs.h:52:11: note: using declaration
  using ::abs;
/usr/include/c++/7/bits/std_abs.h:61:3: error: declaration conflicts with target of using declaration already in scope
  abs(long long __x) { return __builtin_llabs (__x); }
/usr/include/c++/v1/stdlib.h:113:44: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
/usr/include/c++/7/bits/std_abs.h:52:11: note: using declaration
  using ::abs;
In file included from main.cpp:1:
In file included from /usr/include/c++/7/iostream:39:
In file included from /usr/include/c++/7/ostream:38:
In file included from /usr/include/c++/7/ios:42:
In file included from /usr/include/c++/7/bits/ios_base.h:41:
In file included from /usr/include/c++/7/bits/locale_classes.h:40:
In file included from /usr/include/c++/7/string:52:
In file included from /usr/include/c++/7/bits/basic_string.h:6352:
In file included from /usr/include/c++/7/ext/string_conversions.h:41:
/usr/include/c++/7/cstdlib:177:3: error: declaration conflicts with target of using declaration already in scope
  div(long __i, long __j) { return ldiv(__i, __j); }
/usr/include/c++/v1/stdlib.h:116:42: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY  ldiv_t div(     long __x,      long __y) _NOEXCEPT {return  ldiv(__x, __y);}
/usr/include/c++/7/cstdlib:145:11: note: using declaration
  using ::div;

作为一个提醒。我只是在尝试编译《Hello, World》。

我还试着用以下命令卸载并重新安装了Clang。

$> sudo apt-get purge --auto-remove clang
$> sudo apt-get update
$> sudo apt-get install clang

这没有任何效果。我运行的是Ubuntu 18.04,我不知道哪里出了问题,也不知道该从哪里开始修复它。我的构建环境一团糟。

如果可能的话,我想让Clang工作,而不是退回到使用G++,因为我的IDE似乎自动检测Clang并使用它进行语法检查。这意味着我写的每一个C++程序在第一行都有一个致命的错误("iostream not found"),而文件的其他部分则没有被检查,因为第一行是一个致命的错误。

Update (2)

我试着从Ubuntu apt软件库中再安装一些软件包,但没有成功。

$> sudo apt-get install libc++1 libc++1-9 libc++abi1 libc++abi1-9 llvm-9 llvm-9-dev
$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 -stdlib=libc++ main.cpp
/usr/bin/ld: cannot find -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我也试过sudo apt-get install lc++1,但发现这是一个完全不相干包。

Update (3)

我又花了几个小时试图解决这个问题,从apt和源代码中安装多个软件包,尝试不同版本的各种工具,从其他来源手动复制库,甚至跳上Clang IRC,直接与几个非常有经验的开发人员交谈。

没有人能够弄清楚我的笔记本电脑出了什么问题,我所做的一切都无法让它工作。

不幸的是,再过两周我就没有这台笔记本了,所以我很可能需要把这个问题关闭为 "无法重现"--因为一旦这台笔记本不在了,我就没有办法重现这个破碎的开发环境了。

3 个评论
你是如何构建或安装Clang的?它是否被配置为使用自己的 libc++ 而不是GCC的 libstdc++ ?如果你在构建应用程序时加入 -stdlib=libc++ 的选项,会发生什么?
@Someprogrammerdude I think 我做了 sudo apt-get install clang ,但说实话,我有 no 在这一点上,我没有任何想法。我使用这台笔记本电脑进行开发已经两年了,我不得不安装和卸载太阳底下的每一个工具,以使开源项目能够正常构建,或者使第三方代码能够正常工作。我不知道Clang是什么时候安装的,也不知道它怎么会出现在我的系统上。我如何检查它是否被配置为使用 libc++ stdc++
@Someprogrammerdude 当我使用 stdlib=libc++ 时我得到一个新的错误。【替换代码1
c++
linux
clang
clang++
stevendesu
stevendesu
发布于 2019-02-05
5 个回答
suntao
suntao
发布于 2021-02-12
已采纳
0 人赞同

我也被这个问题困扰了很久。你应该试着删除这个文件夹(cd /usr/lib/gcc/aarch64-linux-gnu/8)。clang++不能工作的原因是这个文件夹不包含libstdc++.a。

clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/5
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/6
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/6.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7.3.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6.5.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/7.3.0
Selected GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7.3.0

检查/usr/lib/gcc/aarch64-linux-gnu/中的所有文件夹。 clang++会选择最后一个,确保最后一个文件夹里有libstdc++.a。

这绝对是我没有尝试过的,而且很可能已经解决了我的问题,不幸的是,我已经不再拥有出现问题的笔记本电脑,所以我无法证实,正如我在上次更新中提到的。那是一台工作用的笔记本电脑,我找到了一份新工作。在我的新工作中,他们没有让我写任何C++代码。
我在编译一个使用clang++的应用程序时遇到了问题,它找不到标准头文件。ls ls /usr/lib/gcc/x86_64-linux-gnu/显示了7和8两个版本。我运行了 mv /usr/lib/gcc/x86_64-linux-gnu/8 /tmp
这就是了。我只想补充一点,我发现最简单的补救办法是安装clang试图使用的g++版本。因此,例如,在你的例子中,由于clang "选择 "了gcc 7,我知道的最简单的解决方法是 "sudo apt install g++-7"(如果在ubuntu或debian上)。
这就是我的问题,在我的情况下,原来是Ubuntu 16.04上的 gccgo 包创建了 /usr/lib/gcc/x86_64-linux-gnu/6 而没有 libstdc++.a 。移除该软件包(在我的例子中, gccgo gccgo-5 gccgo-6 )后,清除了该目录并修复了我的 clang++ 工具链。
Steven Bell
Steven Bell
发布于 2021-02-12
0 人赞同

我发现clang在使用 /usr/lib/gcc/x86_64-linux-gnu/8 中的安装(使用 clang++ -v ),而这确实不包含文件 libstdc++.a 。 我没有按照另一个答案的建议删除整个目录,而是直接安装了 libstdc++-8-dev

我在Ubuntu 18.04上;已经安装了gcc。

wasmup
wasmup
发布于 2021-02-12
0 人赞同

首先找到你的版本(路径)。

ls /usr/include/c++/

输出(你的版本可能不同)。

然后添加include路径,并将11替换为你的版本,例如。

-I/usr/include/c++/11 
-I/usr/include/x86_64-linux-gnu/c++/11

Build

这在Linux上对我有效(并将11替换成你的版本)。

clang++ -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -L /usr/lib/gcc/x86_64-linux-gnu/11 main.cpp -o main

通过这个简单的例子(main.cpp)。

#include <iostream>
int main() { std::cout << "Hi\n"; }

另外,你可以使用 cplus_include_path (并将11替换为你的版本)。

export CPLUS_INCLUDE_PATH=/usr/include/c++/11:/usr/include/x86_64-linux-gnu/c++/11

Then this works:

clang++ main.cpp -o main
./main
https://superuser.com/questions/358255/bash-environment-variable-to-include-path-of-c-libraries

如何查询clang++的默认包含路径?

Clang没有看到基本头文件

https://askubuntu.com/questions/516801/clang-fails-to-compile-simple-hello-world-c-program

I hope this helps someone.

Arjaan Buijk
Arjaan Buijk
发布于 2021-02-12
0 人赞同

这个问题通常是由 clang++ 需要 g++ 提供的头文件造成的。它通过寻找 gcc 来检查使用什么版本。如果你的系统上有一个较晚的 gcc 的版本,而没有相应的 g++ ,它将找不到 g++ 的头文件。

In other words, clang++ gives the error fatal error: 'iostream' file not found when:

  • you only install gcc-xx and not g++-xx
  • you upgrade gcc-xx but forget to upgrade g++-xx .
  • 因此,如果你遇到这个错误,应该通过安装两者的最新版本来解决,比如说。

    sudo apt update
    sudo apt install gcc-10 g++-10 
        
    ddiepo
    ddiepo
    发布于 2021-02-12
    0 人赞同

    简而言之:确保你的系统上有libstdc++对应于最新版本的gcc。

    在我的系统上一切都很好,直到有一天我试图用clang编译,它因为找不到iostream而崩溃了。 然而,G++编译得很好。