这是我第一次使用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
编译任何内容。
答案 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 ++)已经足够了。