Ответ 1
Вам нужно установить libc++
и заставить clang использовать его с -stdlib=libc++
Это первый раз, когда я использую 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.
Вам нужно установить libc++
и заставить clang использовать его с -stdlib=libc++
У меня была аналогичная проблема: GCC (g++) уже был установлен на моем LinuxMint (база Ubuntu), поэтому при компиляции с clang возникала ошибка: ни один член с именем "получает" в глобальном пространстве имен, используя:: gets ".
разрешено путем установки libС++ - dev (sudo apt-get install libc++-dev
) и компиляции с -stdlib ++ (clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld
)
Ваша настоящая проблема заключается в том, что вы используете С++ 14 (С++ 1y было неофициальным именем, используемым для ссылки на него, когда оно еще не было полностью сформировано), с библиотекой С++, принадлежащей GCC 4.8. GCC 4.8 имеет полную поддержку С++ 11, но почти не запускается в С++ 14.
Это вызвано удалением С++ 14 std::gets
и библиотекой GNU C, ожидающей этого, не определяя gets
в глобальном пространстве имен, в то время как библиотека С++ еще не догнала и пытается сделать ее доступной в пространстве имен std
.
Правильный способ решить эту проблему не требует использования libС++, просто для использования библиотеки С++ с поддержкой С++ 14. GLIBCXX 4.9 (aka libstdС++) уже достаточно.