
Externe Bibliotheken
« | 24 Sep 2023 | »Wenn es um die Enwicklung von Basis-Strukturen und OS-Anbindungen geht, mache ich natürlich alles selbst. Aber heute braucht man auch Kompression, Verschlüsselung und jede Menge Datenformate um mit der Welt “reden” zu können.
Dies alles erledigen “externe Bibliotheken”, die ich bisher immer im Schlepptau dabei hatte. Nun bekommen sie ihr eigenes Vehikel.
Die Verwaltung von Abhängigkeiten ist in C und
C++ leider immer noch ein
ungutes Thema. Gleich vorab würde ich sagen: Nutzt CONAN!
Ja, CONAN ist mühsam zu erlernen, aber es bietet tatsächlich genau die
Infrastruktur, mit der wirklich jedes Kompilat mit jeder möglichen Einstellung
abgebildet wird.
An der Stelle wäre das Thema “Externe Bibliotheken” eigentlich auch schon beendet und das GATE Framework unterstützt auch einen CONAN-basierten Build für alle Abhängigkeiten.
Aber:
Leider erfüllen viele Bibliotheken heute nicht “meine” Anforderungen. Und die handeln alle von Kompatibilität hin zu sehr alten Systemen. Für Windows 95 brauche ich einen MSVC 2003 und für Haiku einen GCC 2.
Daran scheitert vieles … doch meistens nur an wenigen Zeilen.
Und aus diesem Grund pflege ich gepatchte Varianten von Bibliotheken wie OpenSSL, ZLIB, LZMA, JPEG, PNG, GIF oder SQLITE in einem zusätzlichen Repository namens extlibs.
Gleichzeitig führen einige Bibliotheken eine Vielzahl von Einstellungen mit sich, die ich nicht benötige. Hier kann ein angepasstes und verschlanktes Buildsystem die Nutzung erheblich verbessern.
Notwendige Anpassungen
- OpenSSL nutzt heute die moderne
BCRYPT
API unter Windows um Zufallszahlen zu erzeugen. Damit läuft ganz OpenSSL erst ab Windows Vista. Mit der Abänderung von genauer einer Funktion auf die frühere OpenSSL Implementierung mitWinCrypt
läuft OpenSSL auch auf Windows 9X und NT 4. _s
und_r
sind tolle neue Erweiterungen für bestehendePOSIX
Funktionen, die ältere Compiler und deren Standard-Libs nicht kennen. Hier hilft meist einCMAKE
Patch, der auf den alten Compilern ein Makro einspeist, welches ein
sprintf_s(buf, sz, fmt, ...)
aufsprintf(buf, fmt, ...)
umleitet.
Eingmtime_r
kann man aber auch in einer eigenen Funktion implementieren, die ein Mutex-geschütztesgmtime
nutzt. Und eine solche Patch-Funktion wird dann einfach mitkompiliert.- Fehlende Platformen wie
WINCE
oderHAIKU
landen gerne mal in einem#error
Block. Meist braucht man nur an die#ifdef WIN32 ... #else
Zeilen ein weiteres#ifdef
anfügen und schon läuft die ganze Lib auf einer offiziell nicht unterstützten Plattform. - Unvollständige Spezialitäten wie Assembler-Support deaktiviere ich gerne
im Ganzen. LZMA kommt mit jeder Menge
#if
Spielereien um auf schnellere Assemblermodule umzuleiten. Das funktioniert aber oft nicht korrekt, und so helfe ich gerne nach, dass immer der#else
Block mit der generischen C Implementierung aktiv wird. WINCE
undUEFI
Dummies für unbenutzte Features: Die ZLIB ist genial, aber warum sind dort direkte POSIX-Aufrufe für Dateien drinnen? WinCE hat das alles nicht implementiert, und obwohl ich keine Datei-basierte ZLIB Funktionen nutze, werden diese zum Requirement. Also muss ich Dummy-Funktionen für die exotischen Plattformen belegen, die einfach nur da sind, um nicht aufgerufen zu werden.
Es gibt sicher noch ein paar andere Spielereien, aber die genannten Punkte decken die meisten Änderungen ab, die ich bei externen Bibliotheken einfach brauche.
All das ist nun in den extlibs
implementiert.
Fazit
Dass ein C++ Projekt seine externen Abhängigkeiten selbst mitführt, war viele Jahre “normal” … und ist heute der Grund warum C++ abgehängt wirkt, weil kein einheitliches Verwaltungssystem hierfür existierte.
Mit der Einführung von CONAN
kann jedoch auch jedes C++ Projekt mit jedem
Compiler und jedem erdenklichen Buildsystem darauf vertrauen, dass notwendige
Sourcen heruntergeladen und passen kompiliert werden.
Und dennoch wird es besonders im C und C++ Bereich immer Nischen geben, die für exotische Aufgaben Anpassungen vornehmen müssen, die einer zentralen Paketverwaltung widersprechen.
Meine “historischen” Plattformen wären ein solchen Beispiel, doch in der Mikrokonroller-Welt lassen sich bestimmt auch ähnliche Nischen finden.