这是我第一次使用clang.我注意到,引用std库的clang的任何错误都是这样的:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
^^^ ^^^ ^^^
Run Code Online (Sandbox Code Playgroud)
所以它看起来像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.
Run Code Online (Sandbox Code Playgroud)
我以前安装过多个版本(在同一时间,所使用它们update-alternatives)的gcc使用apt-get.现在我只有4.8(我卸载了其他人).我可以搞砸了吗?我从来没有安装过clang(我猜它是默认的Ubuntu).
只是为了澄清:正确的程序编译和运行clang++.
进一步的测试:我知道在他们的标准c ++ 11库(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)中gcc没有实现类似is_trivially_constructible和移动操作的类型,而且clang已经完整的c ++ 11符合库,所以我测试了那些用clang编译,我得到了相应的gcc错误,这只能证实clang正在使用gcc库.iostream
一个非常基本的计划
#include <iostream>
using namespace std;
int main() {
cout << "Yada Yada" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在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;
~~^
Run Code Online (Sandbox Code Playgroud)
所以现在我无法用c++1yclang 编译任何东西.
Bau*_*gen 23
您需要安装libc++并使clang使用它-stdlib=libc++
小智 11
我有类似的问题:GCC(g ++)已经安装在我的LinuxMint(Ubuntu基础)上,所以当用clang编译时,得到一个"错误:没有成员在全局命名空间中使用:: 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(aka libstdc ++)已经足够。