Подтвердить что ты не робот

Clang, похоже, использует библиотеки gcc

Это первый раз, когда я использую 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.

4b9b3361

Ответ 1

Вам нужно установить libc++ и заставить clang использовать его с -stdlib=libc++

Ответ 2

У меня была аналогичная проблема: 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)

Ответ 3

Ваша настоящая проблема заключается в том, что вы используете С++ 14 (С++ 1y было неофициальным именем, используемым для ссылки на него, когда оно еще не было полностью сформировано), с библиотекой С++, принадлежащей GCC 4.8. GCC 4.8 имеет полную поддержку С++ 11, но почти не запускается в С++ 14.

Это вызвано удалением С++ 14 std::gets и библиотекой GNU C, ожидающей этого, не определяя gets в глобальном пространстве имен, в то время как библиотека С++ еще не догнала и пытается сделать ее доступной в пространстве имен std.

Правильный способ решить эту проблему не требует использования libС++, просто для использования библиотеки С++ с поддержкой С++ 14. GLIBCXX 4.9 (aka libstdС++) уже достаточно.