【问题标题】:clang seems to use the gcc librariesclang 似乎使用 gcc 库
【发布时间】:2014-08-12 02:23:19
【问题描述】:

这是我第一次使用clang。我注意到,clang 引用 std 库的任何错误如下所示:

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
                ^^^                  ^^^                         ^^^

所以它看起来像 clang 链接——或者至少包括——gcc 库。

我使用的命令:clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o。 (为了证明这一点,程序故意犯了错误)。

这怎么可能?我该怎么做才能让clang 使用它自己的库(但不破坏 gcc)?


附加信息:

我在 Ubuntu 14.04 机器上。

clang++ --version
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix

g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.

我之前安装了gccapt-get 的多个版本(同时与update-alternatives 一起使用)。现在我只有4.8(我已经卸载了其他的)。那我能搞砸什么吗?我从未安装过 clang(我猜它是 Ubuntu 的默认设置)。

澄清一下:正确的程序在clang++中编译和运行。

进一步的测试:我知道gcc 还没有实现像is_trivially_constructible 这样的类型,并在他们的标准c++11 库(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html) 中移动iostream 上的操作,并且clang 有完整的c++ 11 符合库,所以我测试了那些用 clang 编译的,我得到了相应的 gcc 错误,这只能确认 clang 正在使用 gcc 库。

一个非常基本的程序

#include <iostream>
using namespace std;

int main() { 
  cout << "Yada Yada" << endl;
  return 0;
}

在 clang++ 中使用 -std=c++1y 编译时出现此错误:

In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/iostream:39:
...
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:120:11: error: no member named 'gets' in the global namespace
  using ::gets;
        ~~^

所以现在我无法在 clang 中使用 c++1y 编译任何东西。

【问题讨论】:

    标签: c++ gcc clang


    【解决方案1】:

    您需要安装libc++ 并让clang 与-stdlib=libc++ 一起使用

    【讨论】:

    • 我无法安装libc++(关于依赖项的一些错误)。我安装了libc++1(它看起来像是我想要的 c++11 库)。当我使用-stdlib=libc++ 编译时,我得到fatal error: 'iostream' file not found #include &lt;iostream&gt;。如果我用-stdlib=libc++1 编译,我得到clang: error: invalid library name in argument '-stdlib=libc++1'。任何想法?谢谢。
    • 根据这个答案stackoverflow.com/questions/20587228/…我已经检查了两个simlinks并且它们都是正确的,但是在链接的文件夹中有一些标题,但不是标准标题
    • 对不起,我对 Ubuntu 不太了解,但在 Fedora 下,从源代码构建 libc++ 很容易。 (虽然我遇到了一个有趣的链接器错误,但这是一个不同的问题,已经在 SE 上回答了)。
    • @bolov 要使用它实际构建新程序,您需要libc++-dev(标题),而不仅仅是libc++1(库)。
    • @o11c,如果我编译一个二进制文件给别人,我需要确保用户在他们的机器上有libc++1吗?虽然,我想同样的问题也适用于g++libstdc++。现代 Linux 发行版是否默认安装某些版本的 libstdc++
    【解决方案2】:

    我遇到了类似的问题:GCC (g++) 已经安装在我的 LinuxMint(Ubuntu 基础)上,所以当使用 clang 编译时,出现“错误:使用 ::gets 的全局命名空间中没有名为 'gets' 的成员”。

    通过安装 libc++-dev (sudo apt-get install libc++-dev) 并使用 -stdlib++ (clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld) 编译解决

    【讨论】:

      【解决方案3】:

      您真正的问题是您使用的是 C++14(c++1y 是尚未完全形成时用来指代它的非正式名称),以及属于 GCC 4.8 的 C++ 库。 GCC 4.8 完全支持 C++11,但几乎没有开始使用 C++14 功能。

      这是由于 C++14 删除了 std::gets 造成的,而 GNU C 库则没有在全局命名空间中定义 gets,而 C++ 库尚未赶上并试图使其可用在std 命名空间中。

      解决这个问题的正确方法不需要使用 libc++,只需使用支持 C++14 的 C++ 库即可。 GLIBCXX 4.9(又名 libstdc++)已经足够了。

      【讨论】:

      • 这不是真正的问题。我知道libstd++libc++在C++11/C++14标准的实现阶段不同,我只是用这些知识来证明使用的是哪个库。
      • 我在尝试使用 Clang 3.8 以 C++14 模式构建时,使用 GCC 4.9.4 的 libstdc++ 修复它时,收到了这个完全相同的错误消息。
      • 再次:这个问题不是关于修复错误。从我的问题中阅读以“进一步测试”开头的段落。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多