Soll ich libc ++ oder libstdc ++ verwenden? [geschlossen]

89

Ich entwickle ausführbare Dateien für die Befehlszeilenschnittstelle für OSX und Linux mit c / c ++. Das Projekt wird gegen opencv verlinkt. Soll ich libc ++ oder libstdc ++ verwenden?

Loozie
quelle
1
Ich weiß nicht, aber Sie können dies von Interesse finden: clang-developers.42468.n3.nabble.com/…
DarenW
2
Diese Antwort kann hilfreich sein.
Yantao Xie
2
Wenn Sie gegen opencv verlinken, verwenden Sie libstdc ++. Hier ist, warum stackoverflow.com/questions/13037659/…
Loozie

Antworten:

87

Ich würde die native Bibliothek für jedes Betriebssystem verwenden, dh libstdc ++ unter GNU / Linux und libc ++ unter Mac OS X.

libc ++ ist unter GNU / Linux nicht zu 100% vollständig, und es gibt keinen wirklichen Vorteil, es zu verwenden, wenn libstdc ++ vollständiger ist. Wenn Sie eine Verknüpfung zu anderen in C ++ geschriebenen Bibliotheken herstellen möchten, wurden diese mit ziemlicher Sicherheit mit libstdc ++ erstellt, sodass Sie auch eine Verknüpfung herstellen müssen, um sie zu verwenden.

Weitere Informationen hier zur Vollständigkeit von libc ++ auf verschiedenen Plattformen.

Jonathan Wakely
quelle
3
Könnten Sie Links zum Vollständigkeitsstatus von libc ++ unter Linux ausarbeiten / bereitstellen? Ich verstehe nicht ganz, warum dies plattformspezifisch wäre, da libc ++ nur eine Reihe von Standard Library-Headern ist. Oder meinst du, dass man Clang Wrt für LLVM-Laufzeitbibliotheken erstellen muss, die unter Linux nicht gut unterstützt werden?
TemplateRex
1
@ TemplateRex, ich kenne den aktuellen Status nicht, Sie können auf libcxx.llvm.org schauen . Ich folge libc ++ nicht, also fragen Sie die falsche Person, aber schlagen Sie vor, dass "eine Reihe von Standard Library-Headern" niemals plattformspezifischen Code enthalten wird?
Jonathan Wakely
Nun, da Sie Linux auf so ziemlich derselben Apple-Hardware installieren können, auf der Mac OS X ausgeführt wird, frage ich mich, woher die Plattformabhängigkeit in C ++ - Headern kommen würde. Vielleicht sind einige Wrapper um eingebaute CPU-Eigenschaften oder E / A- und Ausnahmebehandlungssachen systemabhängig, aber ich habe verstanden, dass solche Dinge in binären Schichten vom Typ librcxxrt behandelt werden. Sollen die Standard Library-Header nicht mehr oder weniger steckbar sein?
TemplateRex
4
Ich spreche nicht von Hardware. Auch hier habe ich keine Ahnung von libc ++, aber die meisten C ++ - Standardbibliotheken werden über die C-Bibliothek des Betriebssystems implementiert, und z. B. ist die Zuordnung von std::ctype_base::maskWerten zu <ctype.h>Konstanten vollständig plattformabhängig. (Die CPU-Eigenschaften werden vom Compiler bereitgestellt. Die Ausnahmebehandlung wird von einer ABI-Ebene auf niedriger Ebene durchgeführt, die E / A-Vorgänge werden jedoch normalerweise vollständig in den C ++ - und C-Bibliotheken ausgeführt, nicht auf niedriger Ebene.)
Jonathan Wakely
1
@abergmeier, das ist ein falsches Argument, da libstdc ++ (bei Verwendung mit GCC oder anderen geeigneten Kompilierungsprozessen) keine Einschränkungen für die Verwendung von Code auferlegt, egal ob dynamisch oder statisch verknüpft. Es ist nicht die LGPL. Bitte verbreiten Sie nicht FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely
30

Wichtige Linux-Distributionen bieten LLVM libc ++ nicht an, weil:

  1. Im Gegensatz zu Apple und FreeBSD ist die GPL + 3 kein Problem, sodass hier kein weiterer Stack implementiert werden muss.
  2. Linux-Komponenten wurden seit Ewigkeiten um GNU libstd ++ herum entwickelt. Einige von ihnen bauen auf nichts anderem auf.
  3. Libc ++ ist zwar stark in neuen Funktionen, hat jedoch einige Probleme mit Legacy-Code.

Wenn libc ++ schließlich Teil von Distributionen wurde, wird es als optionale Komponente verwendet. Das Verknüpfen dagegen erfordert wahrscheinlich zusätzliche Optionen.

Wie Jonathan sagte, sollten Sie jedes Tool verwenden, das standardmäßig enthalten ist. Die Verwendung von Clang ist unter Linux sicher, da es als GCC-Ersatz konfiguriert ist. In diesem Aspekt müssen Sie sich also nicht um zwei Compiler kümmern. Da Sie auf zwei Plattformen abzielen, sollten Sie auch einen Blick auf cmake werfen.

Mario Vazquez
quelle
2
Clang ist kein GCC-Ersatz ... Nur ein weiterer Compiler.
Isaac Pascual
4
@IsaacPascual Was Mario damit gemeint hat, ist, dass Clang offiziell in seinen Designzielen ein Ersatz für den bekannten Compiler auf der Plattform ist, auf der Sie es ausführen (z. B. gcc, wenn es unter Linux ausgeführt wird). Gleiches gilt für Intel Compiler Afaik. Es ist ihr Weg zu einer breiteren Akzeptanz.
Johan Boulé
-3

Es wird gesagt, dass libc ++ mehr lesbare Fehlermeldungen zu Vorlagenfehlern enthält.

DAG
quelle
19
Sind Sie sicher, dass Sie die Behauptungen einer besseren Diagnose nicht mit Klirren verwechseln als mit gcc? Dies ist heutzutage nicht immer der Fall und völlig unabhängig von der verwendeten Standardbibliotheksimplementierung. Wenn Sie Beispiele haben, bei denen Nachrichten besser sind als Hörensagen, melden Sie bitte Fehler unter gcc.gnu.org/bugs
Jonathan Wakely