【发布时间】:2014-08-12 02:23:19
【问题描述】:
这是我第一次使用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 库(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 编译任何东西。
【问题讨论】: