web-dev-qa-db-fra.com

clang semble utiliser les bibliothèques gcc

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.

24
bolov

Vous devez installer libc++ et faire en sorte que clang l'utilise avec -stdlib=libc++

24
Baum mit Augen

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)

11
Rolis

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à.

5
Giel