C'est la première fois que j'utilise clang
. Ce que je remarque, c'est que toute erreur de clang référençant la bibliothèque std ressemble à ceci:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
^^^ ^^^ ^^^
Il ressemble donc à des liens clang - ou au moins comprend - les bibliothèques gcc.
La commande que j'ai utilisée: clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o
. (Le programme avait une erreur intentionnelle juste pour le prouver).
Comment est-ce possible? Que puis-je faire pour que clang
utilise ses propres bibliothèques (mais ne casse pas gcc)?
Information additionnelle:
Je suis sur une machine 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.
J'avais précédemment installé plusieurs versions (en même temps, je les ai utilisées avec update-alternatives
) de gcc
avec apt-get
. Pour le moment, je n'ai que 4.8
(J'ai désinstallé les autres). Aurais-je pu gâcher quelque chose alors? Je n'ai jamais installé clang (je suppose que c'est par défaut avec Ubuntu).
Juste pour clarifier: les bons programmes se compilent et s'exécutent dans clang++
.
Autres tests: je sais que gcc
n'a pas encore implémenté des types comme is_trivially_constructible
et déplacer les opérations sur iostream
dans leur bibliothèque c ++ 11 standard ( https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html ) et que clang a une bibliothèque conforme c ++ 11 complète, j'ai donc testé ceux qui se compilent avec clang et j'ai eu les erreurs gcc correspondantes, ce qui confirme seulement que clang utilise les bibliothèques gcc.
Un programme très basique
#include <iostream>
using namespace std;
int main() {
cout << "Yada Yada" << endl;
return 0;
}
donne cette erreur lors de la compilation avec -std = c ++ 1y dans 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;
~~^
Donc pour l'instant je ne peux rien compiler avec c++1y
in clang.
Vous devez installer libc++
et faire en sorte que clang l'utilise avec -stdlib=libc++
J'avais un problème similaire: GCC (g ++) était déjà installé sur mon LinuxMint (base Ubuntu) donc lors de la compilation avec clang, obtenait une "erreur: aucun membre nommé 'gets' dans l'espace de noms global en utilisant :: gets".
résolu en installant libc ++ - dev (Sudo apt-get install libc++-dev
) et la compilation avec -stdlib ++ (clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld
)
Votre vrai problème est que vous utilisez C++ 14 (c ++ 1y était le nom informel utilisé pour s'y référer quand il n'était pas encore complètement formé), avec une bibliothèque C++ appartenant à GCC 4.8. GCC 4.8 a une prise en charge complète de C++ 11, mais a à peine démarré sur les fonctionnalités de C++ 14.
Cela est dû au fait que C++ 14 a supprimé std::gets
, et la bibliothèque GNU C anticipant cela en ne définissant pas gets
dans l'espace de noms global alors que la bibliothèque C++ n'a pas encore rattrapé et essaie de la rendre disponible dans l'espace de noms std
.
Pour résoudre ce problème, il n'est pas nécessaire d'utiliser libc ++, il suffit d'utiliser une bibliothèque C++ avec prise en charge de C++ 14. GLIBCXX 4.9 (alias libstdc ++) suffit déjà.