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?
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.
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 .
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 Réponses :
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
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)
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++/
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.
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é.
Comment avez-vous construit ou installé Clang? Est-il configuré pour utiliser sa propre
libc ++
au lieu de GCClibstdc ++
? 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 utiliserlibc ++
oustdc ++
?@Someprogrammerdude Quand j'utilise
stdlib = libc ++
j'obtiens une nouvelle erreur:ne trouve pas -lc ++ abi