Поиск iostream в Clang ++ - PullRequest
       9

Поиск iostream в Clang ++

0 голосов
/ 04 февраля 2019

Я написал следующую простую программу на C ++:

#include <iostream>

using namespace std;

int main() {
    cout << "Hello, World" << endl;
    return 0;
}

Когда я компилирую это с помощью g ++, она отлично работает.Когда я пытаюсь скомпилировать с Clang ++, я получаю следующую ошибку:

main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

При работе с параметром -v я вижу следующее:

ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/backward"
ignoring nonexistent directory "/include"
ignoring duplicate directory "/usr/include/clang/6.0.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++
 /usr/include/clang/6.0.0/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

Просмотр этих папок по отдельностиЯ обнаружил, что в /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++ (или, точнее, в /usr/include/c++) у меня есть следующие каталоги:

drwxr-xr-x   5 root root 4.0K Feb  4 09:38 .
drwxr-xr-x 101 root root  20K Feb  4 12:22 ..
drwxr-xr-x  12 root root  12K May 24  2018 5
drwxr-xr-x  12 root root  12K Oct  9 14:53 7
drwxr-xr-x   5 root root 4.0K Feb  4 09:38 v1
lrwxrwxrwx   1 root root    1 Apr 11  2018 5.5.0 -> 5
lrwxrwxrwx   1 root root    1 Apr 15  2018 7.3.0 -> 7

Внутри каждого из 5, 7 и v1в каталогах существует файл с именем iostream

Также в /usr/include/x86_64-linux-gnu существует каталог c++, который выглядит точно так же (с 5, 7, 5.5.0 и * 1027).* каталоги).

Также в /usr/include существует каталог c++, который выглядит точно так же, как два выше

Я не уверен, как моя среда разработки превратилась в такой беспорядок, нона данный момент я просто хотел бы знать, как это исправить, чтобы Clang ++ успешно нашел один из этих 9 экземпляров iostream вместо того, чтобы выдать ошибку, которой он не существует.Нужно ли добавлять переменную окружения, чтобы указать Clang, где искать?Нужно ли передавать параметр командной строки, чтобы сказать Clang рекурсивный поиск?

Update (1)

Когда я пытаюсь собрать с libc++, я получаю следующую ошибку:

$> clang++ -stdlib=libc++ main.cpp
/usr/bin/ld: cannot find -lc++abi
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Когда я пытаюсь создать с переопределенным путем вручную включаемый путь, я получаю следующую ошибку:

$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 main.cpp
/usr/bin/ld: cannot find -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Когда я пробую оба, я получаю следующую (невероятно большую) ошибку:

$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 -stdlib=libc++ main.cpp
In file included from main.cpp:1:
In file included from /usr/include/c++/7/iostream:39:
In file included from /usr/include/c++/7/ostream:38:
In file included from /usr/include/c++/7/ios:42:
In file included from /usr/include/c++/7/bits/ios_base.h:41:
In file included from /usr/include/c++/7/bits/locale_classes.h:40:
In file included from /usr/include/c++/7/string:52:
In file included from /usr/include/c++/7/bits/basic_string.h:6352:
In file included from /usr/include/c++/7/ext/string_conversions.h:41:
In file included from /usr/include/c++/7/cstdlib:77:
/usr/include/c++/7/bits/std_abs.h:56:3: error: declaration conflicts with target of using declaration already in scope
  abs(long __i) { return __builtin_labs(__i); }
  ^
/usr/include/c++/v1/stdlib.h:111:44: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY long      abs(     long __x) _NOEXCEPT {return  labs(__x);}
                                           ^
/usr/include/c++/7/bits/std_abs.h:52:11: note: using declaration
  using ::abs;
          ^
/usr/include/c++/7/bits/std_abs.h:61:3: error: declaration conflicts with target of using declaration already in scope
  abs(long long __x) { return __builtin_llabs (__x); }
  ^
/usr/include/c++/v1/stdlib.h:113:44: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
                                           ^
/usr/include/c++/7/bits/std_abs.h:52:11: note: using declaration
  using ::abs;
          ^
In file included from main.cpp:1:
In file included from /usr/include/c++/7/iostream:39:
In file included from /usr/include/c++/7/ostream:38:
In file included from /usr/include/c++/7/ios:42:
In file included from /usr/include/c++/7/bits/ios_base.h:41:
In file included from /usr/include/c++/7/bits/locale_classes.h:40:
In file included from /usr/include/c++/7/string:52:
In file included from /usr/include/c++/7/bits/basic_string.h:6352:
In file included from /usr/include/c++/7/ext/string_conversions.h:41:
/usr/include/c++/7/cstdlib:177:3: error: declaration conflicts with target of using declaration already in scope
  div(long __i, long __j) { return ldiv(__i, __j); }
  ^
/usr/include/c++/v1/stdlib.h:116:42: note: target of using declaration
inline _LIBCPP_INLINE_VISIBILITY  ldiv_t div(     long __x,      long __y) _NOEXCEPT {return  ldiv(__x, __y);}
                                         ^
/usr/include/c++/7/cstdlib:145:11: note: using declaration
  using ::div;
          ^

В качестве напоминания, Я буквально просто пытаюсь скомпилировать Hello, World

Я также попытался удалить и переустановить Clang с помощью следующей команды:

$> sudo apt-get purge --auto-remove clang
$> sudo apt-get update
$> sudo apt-get install clang

Это не имело никакого эффекта.Я использую Ubuntu 18.04 и понятия не имею, что не так или с чего начать, чтобы исправить это.Моя среда сборки находится в руинах.

Если возможно, я бы хотел, чтобы Clang работал, а не возвращался к использованию G ++, потому что моя IDE, похоже, автоматически обнаруживает Clang и использует его для проверки синтаксиса.Это означает, что каждая написанная мною программа C ++ имеет одну фатальную ошибку в первой строке («iostream not found»), а остальная часть файла не проверяется, потому что первая - фатальная ошибка.

Update (2)

Я попытался установить еще несколько пакетов из репозитория Ubuntu apt безуспешно:

$> sudo apt-get install libc++1 libc++1-9 libc++abi1 libc++abi1-9 llvm-9 llvm-9-dev
$> clang++ -isystem /usr/include/c++/7 -isystem /usr/include/x86_64-linux-gnu/c++/7 -stdlib=libc++ main.cpp
/usr/bin/ld: cannot find -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я также попытался sudo apt-get install lc++1, только чтобы найти это совершенно не связанный пакет.

Обновление (3)

Я потратил еще несколько часов, пытаясь решить эту проблему, устанавливая несколько пакетов как из apt, так и из источника, пробуя разныеверсии различных инструментов, вручную копируемые в библиотеки из других источников, и даже перепрыгивающие на IRC Clang и напрямую общавшиеся с несколькими очень знающими разработчиками.

Никто не смог выяснить, что не так с моим ноутбуком, и ничегоУ меня когда-нибудь получалось, что он работает.

К сожалению, через две недели у меня не будет этого ноутбука, поэтому мне, вероятно, придется закрыть этот вопрос, так как "не могу воспроизвестиoduce "- потому что, когда ноутбук уйдет, у меня не будет возможности воспроизвести испорченную среду разработки.

1 Ответ

0 голосов
/ 28 февраля 2019

Меня тоже очень долго беспокоит эта проблема. Вы должны попытаться удалить папку (cd / usr / lib / gcc / aarch64-linux-gnu / 8).Причина, по которой clang ++ не может работать, состоит в том, что эта папка не содержит libstdc ++. A.

clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/5
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/6
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/6.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7.3.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6.5.0
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/7.3.0
Selected GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/7.3.0

проверьте, чтобы все папки в / usr / lib / gcc / aarch64-linux-gnu / clang ++ выбралипоследний, убедитесь, что в последнем есть libstdc ++. a

...