【问题标题】:Clang doesn't see basic headersClang 看不到基本标题
【发布时间】:2014-12-07 15:41:45
【问题描述】:

我尝试在 Fedora 20 上使用 Clang 编译简单的 hello world,我得到以下输出:

d.cpp:1:10:致命错误:找不到“iostream”文件

#include <iostream>

我不知道如何解决它。

【问题讨论】:

  • clang++ -v your_file.cpp,确保显示正确的包含目录。
  • #include "..." 搜索从这里开始:#include <...> 搜索从这里开始:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9。 1/../../../../include/c++ /usr/local/include /usr/bin/../lib/clang/3.4/include /usr/include 搜索列表结束。
  • 张贴在这里没有帮助。您必须确定编译器是否找到了正确的包含目录。如果您是从源代码编译的,请确保您执行了make install。并将目录添加到您的路径中。
  • @remyabel: iostream 是标准库头文件。如果没有任何特殊选项它不能工作,则 编译器 没有正确安装。
  • -std=c++11 和可能-stdlib=libc++ 包括在线路上?

标签: c++ c++11 clang clang++ llvm-clang


【解决方案1】:

这是因为 g++ 没有安装,所以 libstdc++ 不存在。

您可以安装 g++,或者如果首选 LLVM,安装 LLVM libc++ 并指定要使用它,如下所示:

sudo apt-get install libc++-dev
clang++ -stdlib=libc++ <rest of arguments>

您可能希望将 /usr/bin/c++ 链接到默认编译器:

ln -s /usr/bin/c++ /usr/bin/clang++-libc++

然后简单地使用

编译
$ c++ <args_as_usual>

【讨论】:

  • 我使用的是 fedora 20。g++ 和 llvm 已安装,libc++ 也已安装 :-)
  • @sweet_sugar 抱歉,我使用 Mint,不知道 Fedora 是如何打包的。在 Debian 上,LLVM 标头位于 libc++-dev 中,与 libc++(二进制运行时库)分开。
  • 对于 Fedora,包是 libcxxlibcxx-devel
【解决方案2】:

第 3 点为我解决了问题。

1。 有同样的问题,fedora 21::clang 3.5.0:

clang++ -std=c++14 -pedantic -Wall test_01.cpp -o test_01 -v

2.

ignoring nonexistent directory "/usr/lib/gcc/i686-redhat-linux/4.9.2/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/bin/../lib/clang/3.5.0/include
 /usr/include
End of search list.
test_01.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>

3.

sudo yum install gcc-c++

4.

#include "..." search starts here:
#include <...> search starts here:
 /bin/../lib/gcc/i686-redhat-linux/4.9.2/../../../../include/c++/4.9.2
 /bin/../lib/gcc/i686-redhat-linux/4.9.2/../../../../include/c++/4.9.2/i686-redhat-linux
 /bin/../lib/gcc/i686-redhat-linux/4.9.2/../../../../include/c++/4.9.2/backward
 /usr/local/include
 /usr/bin/../lib/clang/3.5.0/include
 /usr/include
 /usr/lib/gcc/i686-redhat-linux/4.9.2/include
End of search list.

【讨论】:

  • @Slizzered 我添加了 clang++ -std=c++14 但得到错误:错误:'-std=c++14'中的无效值'c++14'
  • 这意味着clang使用了gcc在/usr/include目录中提供的系统头文件,对吧?直到现在才明确知道 clang 从何处获取其系统包含或系统标头。
【解决方案3】:

看起来您应该为您的 clang 构建提供 -stdlib 选项。 -stdlib=libc++-stdlib=libstdc++ 之一可能会起作用。

关于您的主题的更多详细信息:

When is it necessary to use the flag -stdlib=libstdc++?

【讨论】:

  • 感谢您的帮助!
【解决方案4】:

-stdlib=libstdc++ 为我解决了这个问题。这是我完整的 tasks.json 配置:

{
"tasks": [
    {
        "type": "shell",
        "label": "clang++ build active file",
        "command": "clang++",
        "args": [
            "-std=c++11",
            "-stdlib=libstdc++",
            "hello.cpp",
            "-o",
            "hello.out",
            "--debug"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }
],
"version": "2.0.0"

【讨论】:

    【解决方案5】:

    对于任何在谷歌上搜索并拥有 MacOS 的人,这是我找到的解决方案:

    将以下内容添加到您的 .bashrc/.zshrc 文件中

    export CPLUS_INCLUDE_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
    

    这应该可以解决它。

    【讨论】:

      【解决方案6】:

      确保您安装了与最新版本的 gcc 相对应的 libstdc++。 Clang 似乎可以识别最新的 gcc 安装,并且只在该版本的相应目录中查找。

      【讨论】:

      • 谢谢!我在 linux mint 上安装了 gcc-10 en g++-9。这使 clang 完全愚蠢:/ 没有提示问题可能是什么。相当愚蠢的恕我直言。
      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2013-01-29
      • 2013-12-07
      • 2023-04-06
      • 2019-07-10
      • 2015-06-27
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多