clang似乎使用了gcc库

clang seems to use the gcc libraries

本文关键字:gcc clang      更新时间:2023-10-16

这是我第一次使用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库中移动对iostream的操作(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html(,并且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编译任何东西。

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

我也遇到过类似的问题: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(编译来解决

您真正的问题是使用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++(已经足够了。