6
votes

Localisation d'iostream dans Clang ++: erreur fatale: fichier 'iostream' introuvable

J'ai écrit le programme C ++ simple suivant:

$> 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)

Quand je compile ceci avec g ++, cela fonctionne parfaitement. Lorsque j'essaye de compiler avec Clang ++, j'obtiens l'erreur suivante:

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

En cours d'exécution avec le paramètre -v , je vois ce qui suit: p>

$> 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;
          ^

En examinant individuellement ces dossiers, j'ai trouvé cela dans /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../. ./../../include/c++ (ou, plus brièvement, dans / usr / include / c ++ ) J'ai les répertoires suivants:

$> 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)

Dans chacun des répertoires 5 , 7 et v1 , il existe un fichier appelé iostream code>

Aussi dans / usr / include / x86_64-linux-gnu il existe un répertoire c ++ qui ressemble exactement à celui-ci (avec 5 , 7 , 5.5.0 et 7.3.0 ).

Aussi dans / usr / include il existe un répertoire c ++ qui ressemble exactement aux deux ci-dessus

Je ne sais pas comment mon environnement de développement est devenu un tel désordre , mais à ce stade, je voudrais juste savoir comment pour le corriger afin que Clang ++ trouve avec succès l'une de ces 9 instances de iostream au lieu de renvoyer une erreur indiquant qu'elle n'existe pas. Dois-je ajouter une variable d'environnement pour indiquer à Clang où chercher? Dois-je passer un paramètre de ligne de commande pour dire à Clang de rechercher récursivement?

Update (1)

Quand j'essaye de construire avec libc ++ , j'obtiens l'erreur suivante:

$> 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)

Lorsque j'essaye de construire avec le chemin d'inclusion remplacé manuellement, j'obtiens l'erreur suivante:

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

Lorsque j'essaye les deux, j'obtiens l'erreur suivante (incroyablement grande):

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.

Pour rappel, J'essaie littéralement de compiler Hello, World

J'ai également essayé de désinstaller et de réinstaller Clang avec la commande suivante:

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

Cela n'a eu aucun effet. J'utilise Ubuntu 18.04 et je n'ai aucune idée de ce qui ne va pas ni par où commencer pour le réparer. Mon environnement de construction est en ruine.

Si possible, j'aimerais faire fonctionner Clang au lieu de revenir à l'utilisation de G ++, car mon IDE semble détecter automatiquement Clang et l'utiliser pour la vérification de la syntaxe. Cela signifie que chaque programme C ++ que j'ai écrit a une erreur fatale sur la première ligne ("iostream not found") et le reste du fichier n'est pas coché car ce premier est une erreur fatale.

Update ( 2)

J'ai essayé d'installer quelques paquets supplémentaires à partir du dépôt Ubuntu apt sans succès:

#include <iostream>

using namespace std;

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

J'ai aussi essayé sudo apt -get install lc ++ 1 uniquement pour trouver qu'il s'agit d'un package totalement indépendant .

Update (3)

J'ai passé plusieurs heures à essayer de résoudre ce problème, à installer plusieurs packages à la fois à partir d'apt et à partir des sources, à essayer différentes versions de divers outils, à copier manuellement dans des bibliothèques à partir d'autres sources, et même à sauter sur l'IRC Clang et à parler à plusieurs très des développeurs expérimentés directement.

Personne n'a été en mesure de comprendre ce qui ne va pas avec mon ordinateur portable, et rien de ce que j'ai fait ne l'a jamais fait fonctionner.

Malheureusement, je n'aurai toujours pas cet ordinateur portable encore deux semaines, donc je devrai probablement clôturer ce problème car "impossible reproduce "- car une fois l'ordinateur portable parti, je n'aurai aucun moyen de reproduire l'environnement de développement défectueux.


3 commentaires

Comment avez-vous construit ou installé Clang? Est-il configuré pour utiliser sa propre libc ++ au lieu de GCC libstdc ++ ? Que se passe-t-il si vous ajoutez l'option -stdlib = libc ++ lors de la construction de votre application?


@Someprogrammerdude Je pense que j'ai fait sudo apt-get install clang , mais pour être honnête, je n'ai aucune idée à ce stade. J'utilise cet ordinateur portable pour le développement depuis deux ans maintenant et j'ai dû installer et désinstaller tous les outils sous le soleil pour que les projets open source se construisent correctement ou pour que le code tiers fonctionne correctement. On ne sait pas quand Clang a été installé ou comment il a pu être installé sur mon système. Comment vérifier s'il est configuré pour utiliser libc ++ ou stdc ++ ?


@Someprogrammerdude Quand j'utilise stdlib = libc ++ j'obtiens une nouvelle erreur: ne trouve pas -lc ++ abi


3 Réponses :


5
votes

Ce problème me préoccupe aussi depuis longtemps. Vous devriez essayer de supprimer le dossier (cd / usr / lib / gcc / aarch64-linux-gnu / 8). La raison pour laquelle clang ++ ne peut pas fonctionner est que ce dossier ne contient pas 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

vérifiez tous les dossiers dans / usr / lib / gcc / aarch64-linux-gnu / clang ++ choisira le dernier, assurez-vous qu'il y a le libstdc ++. a dans le dernier


3 commentaires

C'est certainement quelque chose que je n'ai pas essayé et qui a peut-être très bien résolu mes problèmes, malheureusement je ne suis plus en possession de l'ordinateur portable qui rencontrait le problème, donc je ne peux pas vérifier, comme je l'ai mentionné dans ma dernière mise à jour. C'était un ordinateur portable de travail et j'ai trouvé un nouvel emploi. À mon nouveau travail, ils ne me demandent pas d'écrire de code C ++.


J'avais un problème pour compiler une application qui utilisait clang ++ qui ne pouvait pas trouver les headers standard.ls ls / usr / lib / gcc / x86_64-linux-gnu / montrait les versions 7 et 8. J'ai lancé mv / usr / lib / gcc / x86_64-linux-gnu / 8 / tmp


Ça y est. J'ajouterais simplement que le remède le plus simple que j'ai trouvé est d'installer la version de g ++ que clang essaie d'utiliser. Ainsi, par exemple, puisque clang a "sélectionné" gcc 7 dans votre exemple, la solution la plus simple que je connaisse est de "sudo apt install g ++ - 7" (si sur ubuntu ou debian)



1
votes

Commencez par trouver votre version (chemin):

g++ (Ubuntu 8.3.0-6ubuntu1) 8.3.0

Output:

g++ --version 

Ajoutez ensuite les chemins d'inclusion et remplacez 8 avec votre version:

./main

Cela fonctionne pour moi sous Linux:

clang++ main.cpp -o main

Aussi vous pouvez utiliser CPLUS_INCLUDE_PATH :

export CPLUS_INCLUDE_PATH=/usr/include/c++/8:/usr/include/x86_64-linux-gnu/c++/8

Ensuite, cela fonctionne:

clang++ -I/usr/include/c++/8 -I/usr/include/x86_64-linux-gnu/c++/8 -L /usr/lib/gcc/x86_64-linux-gnu/8 abc.cpp -o abc

Run:

-I/usr/include/c++/8 
-I/usr/include/x86_64-linux-gnu/c++/8

8

Sortie:

ls /usr/include/c++/

Et voir:
https://superuser.com/questions/358255/bash- variable-d'environnement à inclure le chemin-des-bibliothèques-c

Comment interroger les chemins d'inclusion par défaut de clang ++?

Clang ne voit pas les en-têtes de base

https://askubuntu.com/questions/516801/clang-fails-to-compile-simple-hello-world-c-program p>

J'espère que cela aide quelqu'un.


0 commentaires

3
votes

J'ai trouvé que clang utilisait l'installation dans / usr / lib / gcc / x86_64-linux-gnu / 8 (en utilisant clang ++ -v ), et en effet ceci ne contenait pas le fichier libstdc ++. a . Plutôt que de supprimer tout le répertoire comme suggéré par une autre réponse, j'ai pu simplement installer libstdc ++ - 8-dev .

Je suis sur Ubuntu 18.04; gcc était déjà installé.


0 commentaires