首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >clang似乎使用的是gcc的库

clang似乎使用的是gcc的库
EN

Stack Overflow用户
提问于 2014-06-21 21:59:57
回答 3查看 19.7K关注 0票数 27

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

代码语言:javascript
复制
/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机器。

代码语言:javascript
复制
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在他们的标准c++11库(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)中还没有在iostream上实现像is_trivially_constructible和move操作这样的类型,而且clang有完整的c++11符合库,所以我测试了用clang编译的那些,我得到了相应的gcc错误,这仅仅证实了clang正在使用gcc库。

一个非常基础的程序

代码语言:javascript
复制
#include <iostream>
using namespace std;

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

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

代码语言:javascript
复制
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编译任何东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-21 22:05:53

您需要安装libc++并让clang在-stdlib=libc++中使用它

票数 27
EN

Stack Overflow用户

发布于 2016-04-13 20:58:38

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

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

票数 11
EN

Stack Overflow用户

发布于 2018-01-12 23:13:03

您真正的问题是,您正在使用C++14 (c++1y是它还没有完全形成时的非正式名称),它有一个属于GCC 4.8的C++库。GCC 4.8已经完全支持C++11,但几乎没有开始使用C++14特性。

这是由于C++14删除了std::gets,而GNU库期望没有在全局名称空间中定义gets,而C++库还没有跟上,并试图使其在std名称空间中可用。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24342312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档