clang似乎使用了gcc库
clang seems to use the gcc libraries
这是我第一次使用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
还没有实现像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++(已经足够了。
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何让 GCC/Clang 在保留标识符上出错
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- GCC/CLang不同意模板模板参数的部分特化
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- ICC 中的 -O2 搞砸了汇编程序,ICC 中的 -O1 和 GCC / Clang 中的所有优化都很好
- 为什么GCC/Clang甚至在最高优化水平上也不会内联
- 在继承多个空类时,了解GCC/Clang vs MSVC2015之间的不同填充规则
- C++ MSVC/GCC/Clang编译器错误
- 这被认为是有效的C 11还是C 14?还是GCC/Clang弄错了
- GCC/Clang上的模板错误,但在MSVC上没有错误
- 如何求解与GCC/Clang不同的C 功能模板的MSVC处理(无法识别的模板定义)
- 忽略 gcc/clang 的"-Wmissing-braces"警告是否明智?
- GCC/Clang 返回元组时x86_64 C++ ABI 不匹配?
- 为什么根据 C++11 标准,std::seed_seq是不可复制的,为什么 gcc/clang 不符合?
- 我可以用更新的 gcc/clang 定位较旧的 Linux 吗?C++
- gcc/clang:错误:未知类名"异常";你是说'std::exception'
- 模板专业化和DLL:Visual Studio vs. (GCC / Clang)
- 使用GCC/CLANG跟踪代码膨胀的工具