Warum ist die Verwendung von C ++ - Bibliotheken so kompliziert?

14

Zunächst möchte ich erwähnen, dass ich C ++ liebe und einer derjenigen bin, die der Meinung sind, dass es einfacher ist, in C ++ als in Java zu programmieren. Abgesehen von einer winzigen Sache: Bibliotheken.

In Java können Sie einfach etwas jar zum Erstellungspfad hinzufügen und schon sind Sie fertig.

In C ++ müssen Sie normalerweise mehrere Pfade für die Header-Dateien und die Bibliothek selbst festlegen. In einigen Fällen müssen Sie sogar spezielle Build-Flags verwenden. Ich habe hauptsächlich Visual Studio, Codeblöcke und überhaupt keine IDE verwendet. Alle drei Optionen unterscheiden sich kaum, wenn es um die Verwendung externer Bibliotheken geht.

Ich frage mich, warum es dafür keine einfachere Alternative gab. Als ob Sie eine spezielle .zip-Datei hätten, die alles, was Sie brauchen, an einem Ort hat, damit die IDE die ganze Arbeit für Sie erledigen kann, wenn Sie die Build-Flags einrichten. Gibt es dafür eine technische Barriere?

Pijusn
quelle

Antworten:

15

C ++ wurde entwickelt, um die C-Sprache zu verbessern, indem eine einfachere, automatisierte Sprache mit Unterstützung für objektorientierte Programmierung erstellt wird. Es hat jedoch nichts an der Art und Weise geändert oder verbessert, wie C mit externen Bibliotheken und Header-Dateien umgeht. C ++ hat kein Modulsystem wie modernere Sprachen - es verwendet immer noch den C-Präprozessor und das Linkersystem. Da eines der erklärten Ziele von C ++ die Abwärtskompatibilität mit C-Code war, ist dies nicht wirklich überraschend. Jedes C ++ - Modulsystem müsste neben dem alten C-Header-Datei / Linker-System funktionieren. Das C ++ - Standardkomitee ist einfach nicht dazu gekommen, ein moderneres Modulsystem zu entwerfen. (Obwohl sie daran arbeiten, siehe Klaims Kommentar unten.)

Charles Salvia
quelle
8
Die letzte Zeile ist nicht ganz korrekt: Das Modulsystem ist seit 2004 in Arbeit (erstes Dokument), impliziert jedoch so viel Arbeit, dass es für den letzten Standard nicht einmal wirklich in Betracht gezogen werden konnte, da es an der Implementierung gefehlt hätte unterstütze den Vorschlag. Diese Implementierung wurde (zusammen mit anderen Entwürfen) durchgeführt, um den nächsten C ++ - Standard zu erstellen. Es ist nicht so, dass es für C ++ - Designer keine Priorität ist, es ist nur eine dieser Funktionen, die man nicht verwechseln kann, die Retro-Kompatibilität (mit den meisten C-Codes und C ++ 11) gewährleisten muss und die unglaublich schwer zu korrigieren ist. Es braucht also viel Zeit.
Klaim,
Genial. Danke, Klaim, für die Info. Werde es auf jeden Fall ausprobieren. Das ist sehr aufregend :)
Pijusn
Die meisten Sprachen sind nicht in der Lage, Verknüpfungen zu standardisieren, da der Mechanismus zwischen den Betriebssystemen variieren kann. Javas Run-Anywhere-Charakter erfordert die Vorgabe eines bestimmten Verknüpfungs- und Bibliotheksformats. Daran ist nichts auszusetzen, aber es entsteht ein gewisser Overhead, der möglicherweise nicht in allen Fällen wünschenswert ist.
Blrfl
Ehrlich gesagt bin ich ziemlich erschrocken darüber, dass das C ++ - Standardkomitee an einem Modulsystem für die Sprache selbst arbeitet. C ++ ist bereits eine riesige und komplexe Sprache, und der Versuch, eine derart sensible Funktion hinzuzufügen, kann sehr riskant sein. Wie Karl Bielefeldt weiter unten feststellt, hat dieses Problem bereits auf Plattformebene (Linux-Paketsystem) eine gute Lösung gefunden und könnte von den meisten IDEs mit geringem Aufwand wahrscheinlich sehr gut angegangen werden. Schauen Sie sich zum Beispiel an, wie die Qt Library und Qt Creator dieses Problem behandeln.
AlexBottoni
1
@AlexBottoni, ich bezweifle wirklich, dass sie in diesem Jahrhundert ein standardisiertes Modulsystem entwickeln werden. Sie haben nicht einmal Konzepte in C ++ 11 aufgenommen, weil sie sich nicht auf die genaue Implementierung einigen konnten. Ein Modulsystem, das neben dem Header / Linker-System funktioniert, ist noch kniffliger, und wir werden es wahrscheinlich für eine sehr lange Zeit nicht sehen.
Charles Salvia
2

Es ist keine technische Barriere. Unter Linux ist Ihre "spezielle Zip-Datei" ein Library-Dev-Paket, das Sie mit einem Paketmanager installieren, und das Einrichten der Include- und Linker-Flags ist so einfach wie das Hinzufügen einiger Zeilen zu Ihrem configure.ac, die pkg-config zum Einrichten verwenden.

Pkg-config ist auch für Windows verfügbar, aber kulturelle Barrieren haben seine weitverbreitete Akzeptanz verhindert. Unix hat eine lange Tradition in der Ermöglichung von Portabilität durch die Verteilung von Quellcode. Daher enthalten sie die Entwicklungstools kostenlos. Windows hat eine lange Tradition darin, nur Binärdistributions- und Ladeentwickler für Tools zu ermutigen. Wenn Sie mit dem Verkauf von Bibliotheken Geld verdienen, ist es nicht sinnvoll, die Bereitstellung für Dritte zu vereinfachen.

Karl Bielefeldt
quelle