Externe Bibliotheken

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 mit WinCrypt läuft OpenSSL auch auf Windows 9X und NT 4.
  • _s und _r sind tolle neue Erweiterungen für bestehende POSIX Funktionen, die ältere Compiler und deren Standard-Libs nicht kennen. Hier hilft meist ein CMAKE Patch, der auf den alten Compilern ein Makro einspeist, welches ein
    sprintf_s(buf, sz, fmt, ...) auf sprintf(buf, fmt, ...) umleitet.
    Ein gmtime_r kann man aber auch in einer eigenen Funktion implementieren, die ein Mutex-geschütztes gmtime nutzt. Und eine solche Patch-Funktion wird dann einfach mitkompiliert.
  • Fehlende Platformen wie WINCE oder HAIKU 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 und UEFI 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.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!