这是我第一次使用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.
我之前安装了几个版本的gcc
和apt-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库。
一个非常基础的程序
#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
编译任何东西。
发布于 2014-06-21 22:05:53
您需要安装libc++
并让clang在-stdlib=libc++
中使用它
发布于 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
)解决
发布于 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++)已经足够了。
https://stackoverflow.com/questions/24342312
复制相似问题