Это первый раз, когда я использую 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.
Я ранее устанавливал несколько версий (в то же время использовал их с update-alternatives
) gcc
с apt-get
. Сейчас у меня есть только 4.8
(я удалил остальные). Может, я что-то испортил? Я никогда не устанавливал clang (я предполагаю, что это по умолчанию с Ubuntu).
Просто уточнить: правильные программы компилируются и запускаются в clang++
.
Дальнейшие тесты: я знаю, что gcc
не реализовал еще такие типы, как is_trivially_constructible
, и переводит операции на iostream
в свою стандартную библиотеку С++ 11 (https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html) и что у clang есть полная совместимая с С++ 11 библиотека, поэтому я протестировал эти компиляции с clang, и у меня появились соответствующие ошибки gcc, которые только подтверждают, что clang использует библиотеки gcc.
Очень простая программа
#include <iostream>
using namespace std;
int main() {
cout << "Yada Yada" << endl;
return 0;
}
дает эту ошибку при компиляции с -std = С++ 1y в clang++:
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;
~~^
Так что прямо сейчас я не могу скомпилировать что-либо с c++1y
в clang.