Dois-je utiliser libc ++ ou libstdc ++? [fermé]

89

Je développe des exécutables d'interface de ligne de commande pour osx et linux en utilisant c / c ++. Le projet établira un lien avec opencv. Dois-je utiliser libc ++ ou libstdc ++?

Loozie
la source
1
Je ne sais pas, mais vous trouverez peut-être cela intéressant: clang-developers.42468.n3.nabble.com
...
2
Cette réponse peut être utile.
Yantao Xie
2
si vous créez un lien avec opencv, utilisez libstdc ++. voici pourquoi stackoverflow.com/questions/13037659/…
Loozie

Réponses:

87

J'utiliserais la bibliothèque native pour chaque système d'exploitation, c'est-à-dire libstdc ++ sur GNU / Linux et libc ++ sur Mac OS X.

libc ++ n'est pas complète à 100% sous GNU / Linux, et il n'y a aucun réel avantage à l'utiliser lorsque libstdc ++ est plus complète. De plus, si vous souhaitez créer un lien vers d'autres bibliothèques écrites en C ++, elles auront presque certainement été construites avec libstdc ++, vous devrez donc créer un lien avec cela aussi pour les utiliser.

Plus d'informations ici sur l'exhaustivité de libc ++ sur différentes plates-formes.

Jonathan Wakely
la source
3
Pourriez-vous élaborer / fournir des liens sur l'état d'exhaustivité de libc ++ sous Linux? Je ne comprends pas très bien pourquoi cela serait spécifique à la plate-forme car libc ++ n'est qu'un tas d'en-têtes de bibliothèque standard. Ou voulez-vous dire qu'il faut construire Clang avec des bibliothèques d'exécution LLVM qui ne sont pas bien prises en charge sous Linux?
TemplateRex
1
@TemplateRex, je ne connais pas l'état actuel, vous pouvez regarder sur libcxx.llvm.org . Je ne suis pas libc ++ donc vous posez la question à la mauvaise personne, mais suggérez-vous que "un tas d'en-têtes de bibliothèque standard" n'aura jamais de code spécifique à la plate-forme?
Jonathan Wakely
Eh bien, puisque vous pouvez installer Linux sur à peu près le même matériel Apple qui exécute Mac OS X, je me demande d'où proviendrait la dépendance de plate-forme dans les en-têtes C ++? Peut-être que certains wrappers autour des intrinsèques du processeur intégré ou des E / S et de la gestion des exceptions dépendent du système, mais je crois comprendre que de tels éléments sont gérés dans le type librcxxrt de couches binaires. Les en-têtes de la bibliothèque standard ne sont-ils pas censés être plus ou moins enfichables?
TemplateRex
4
Je ne parle pas de matériel. Encore une fois, je n'ai aucune idée de libc ++, mais la plupart des bibliothèques standard C ++ sont implémentées sur la bibliothèque C du système d'exploitation, et par exemple le mappage des std::ctype_base::maskvaleurs aux <ctype.h>constantes dépend entièrement de la plate-forme. (Les fonctions intrinsèques du processeur sont fournies par le compilateur, la gestion des exceptions est effectuée par une couche ABI de bas niveau, mais les E / S sont généralement effectuées entièrement dans les bibliothèques C ++ et C, pas dans des éléments de bas niveau).
Jonathan Wakely
1
@abergmeier, c'est un faux argument, car (lorsqu'il est utilisé avec GCC ou d'autres processus de compilation éligibles) libstdc ++ n'impose aucune restriction sur le code qui l'utilise, qu'il soit lié dynamiquement ou statiquement. Ce n'est pas la LGPL. Veuillez ne pas répandre le FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely
30

Les principales distributions Linux ne fournissent pas LLVM libc ++, car:

  1. Contrairement à Apple et FreeBSD, la GPL + 3 n'est pas un problème, donc pas besoin d'implémenter une autre pile ici.
  2. Les composants Linux ont été développés autour de GNU libstd ++ depuis des lustres. Certains d'entre eux ne s'appuient sur rien d'autre.
  3. Alors que la libc ++ est puissante dans les nouvelles fonctionnalités, elle a quelques problèmes avec le code hérité.

Si finalement libc ++ faisait partie des distributions, ce sera en tant que composant optionnel. la liaison avec elle nécessitera probablement des options supplémentaires.

Comme Jonathan l'a dit, vous devez utiliser n'importe quel outil inclus par défaut. Clang est sûr à utiliser sous Linux car il est configuré comme un remplacement de GCC, donc dans cet aspect, vous n'avez pas à vous soucier de 2 compilateurs. De plus, puisque vous ciblez deux plates-formes, vous devriez jeter un œil à cmake.

Mario Vazquez
la source
2
Clang n'est pas un remplacement de GCC ... Juste un autre compilateur.
Isaac Pascual
4
@IsaacPascual Ce que Mario voulait dire, c'est que clang a officiellement dans ses objectifs de conception de remplacer directement le compilateur de premier plan sur la plate-forme sur laquelle vous l'exécutez (par exemple gcc lorsqu'il est exécuté sous Linux). Idem pour l'afaik du compilateur d'Intel. C'est leur façon d'obtenir une adoption plus large.
Johan Boulé
-3

il est dit que la libc ++ a plus de messages d'erreur lisibles par l'homme sur les erreurs de modèle.

DAG
la source
19
Êtes-vous sûr de ne pas confondre les affirmations de meilleurs diagnostics avec clang qu'avec gcc? Ce qui n'est pas toujours vrai de nos jours et est complètement distinct de l'implémentation de bibliothèque standard utilisée. Si vous avez des exemples où les messages sont meilleurs, plutôt que des ouï-dire, veuillez signaler les bogues sur gcc.gnu.org/bugs
Jonathan Wakely