clang似乎使用gcc库

时间:2014-06-21 13:59:57

标签: c++ gcc clang

这是我第一次使用clang。我注意到,引用std库的clang的任何错误都是这样的:

/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.

我之前已经安装了update-alternatives gcc的多个版本(同时与apt-get一起使用)。现在我只有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编译任何内容。

3 个答案:

答案 0 :(得分:22)

您需要安装libc++并使clang与-stdlib=libc++

一起使用

答案 1 :(得分:11)

我有类似的问题: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)进行编译来解决

答案 2 :(得分:5)

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

这是由C ++ 14删除std::gets引起的,而GNU C库通过在全局命名空间中不定义gets来预测,而C ++库尚未赶上并正在尝试使其在std命名空间中可用。

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