Das Terminal meldet bereitwillig eine OpenSSL-Version, und der Quellbaum scheitert weiterhin mit einer Meldung über fehlende Krypto-Header. Beide Aussagen sind gleichzeitig wahr, weil ein Laufzeitwerkzeug und eine Reihe von Build-Eingaben getrennt ausgeliefert werden. Arbeiten Sie diese vier Prüfungen der Reihe nach ab: installierte Pakete, Suchausgabe, Suchpfade und schließlich, ob die Quelle selbst kompatibel ist. Halten Sie bei der ersten Prüfung an, die den Fehler erklärt, statt eine alte Abhängigkeitsliste einzufügen.

Laufzeit und Build-Eingaben sind verschiedene Pakete

Eine Distribution teilt OpenSSL in ein Laufzeitpaket, das die gemeinsame Bibliothek und das Kommandozeilenwerkzeug bereitstellt, und ein Entwicklungspaket, das Header, unversionierte Linker-Namen und pkg-config-Metadaten bereitstellt. Das erste zu installieren installiert nicht das zweite, und der Compiler braucht nur das zweite.

Prüfen Sie, was tatsächlich vorhanden ist, statt was Sie installiert zu haben glauben. Auf Debian-basierten Systemen ist das Entwicklungspaket meist libssl-dev, während die Laufzeit aus einem versionierten Bibliothekspaket plus dem openssl-Binary besteht.

dpkg -l | grep -E 'libssl-dev|libssl3|openssl'
pkg-config --modversion openssl
openssl version

Der erste Befehl zeigt, welches der drei installiert ist, der zweite meldet die Version, die das Build-System über pkg-config finden wird, und der dritte meldet die Laufzeitversion. Eine fehlende Zeile in der ersten Ausgabe erklärt den Fehler sofort. Eine Versionsabweichung zwischen der zweiten und dritten ist ein anderes Problem und bedeutet meist, dass zwei Installationen konkurrieren.

Lesen Sie die eigene Suchausgabe des Builds

Die meisten Fehler sind im Konfigurationsprotokoll sichtbar, wenn Sie es vor der Zusammenfassung lesen. Das FindOpenSSL-Modul von CMake meldet, welches Include-Verzeichnis und welche Bibliotheken es gefunden hat, und es scheitert mit einer konkreten Meldung, wenn eine erforderliche Komponente fehlt.

Bestätigen Sie, welche Modulversion das Projekt verwendet, denn eine mitgelieferte Kopie im Quellbaum kann sich anders verhalten als die, die mit dem installierten CMake ausgeliefert wird. Lesen Sie dann die Komponentenliste: Ein Projekt, das nur Crypto anfordert, braucht die SSL-Bibliothek nicht, und eines, das SSL anfordert, scheitert, wenn nur ein Teil des Entwicklungspakets vorhanden ist.

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
grep -i -E 'openssl|ssl' build/CMakeCache.txt

Der erste Befehl konfiguriert von Grund auf neu, und der zweite zeigt die zwischengespeicherten Ergebnisse, einschließlich eines Wurzelverzeichnisses oder Bibliothekspfads, auf den sich das Modul festgelegt hat. Wenn der Cache auf ein altes Präfix aus einem früheren Versuch zeigt, löschen Sie das Build-Verzeichnis und konfigurieren Sie erneut, statt Werte von Hand zu bearbeiten. Veraltete Cache-Einträge sind eine häufige Ursache für einen Fehler, der eine korrekte Korrektur überlebt.

Richten Sie den Build eng auf die richtige Installation

Wenn ein freigegebenes OpenSSL außerhalb des Standard-Suchpfads liegt, dokumentiert FindOpenSSL OPENSSL_ROOT_DIR als Hinweis für genau diesen Build. Auf Unix-artigen Systemen fragt es auch pkg-config, sodass ein passendes PKG_CONFIG_PATH helfen kann, ohne irgendetwas global zu ändern.

cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release
ldd build/vpn_client | grep -i ssl

Der erste Befehl begrenzt den Hinweis auf ein Build-Verzeichnis, und der zweite zeigt, welche gemeinsame Bibliothek das entstehende Binary zur Laufzeit lädt. Ein Build, der gegen das beabsichtigte Präfix linkt, und ein Binary, das ein anderes lädt, ist ein Laufzeitpfadproblem, kein Suchproblem, und es verlangt eine Entscheidung zu rpath oder Lader-Konfiguration statt eines weiteren Konfigurationsschalters.

Halten Sie diese Entscheidungen lokal für den Build. Systembibliotheken zu ersetzen oder globale pkg-config-Dateien zu bearbeiten, um einem Projekt zu genügen, ist der Weg, auf dem ein funktionierender Arbeitsplatz ein kaputter wird. Ein Build-Verzeichnis, das das Präfix festhält, ist reproduzierbar; eine maschinenweite Änderung ist ein Supportfall, der auf das nächste Projekt wartet. Löschen Sie das Build-Verzeichnis, wenn Sie den Hinweis ändern, damit der Cache die alte Antwort nicht behalten kann.

Erkennen Sie, wann die Quelle das Problem ist

Ein erfolgreicher Konfigurationsschritt beweist nur, dass die Prüfungen abgeschlossen sind. Die Kompilierung kann eine API, die die Quelle erwartet, weiterhin ablehnen, und das Linken kann weiterhin an einem fehlenden Symbol scheitern. Bewahren Sie den ersten konkreten Fehler jeder Stufe auf, denn die späteren sind meist Folgen.

OpenSSL 3 hat mehrere Schnittstellen als veraltet eingestuft und entfernt, die ältere VPN-Clients direkt nutzen, sodass ein Quellbaum aus dieser Zeit echte Änderungen statt eines neuen Include-Pfads brauchen kann. Wenn die Betreuer eine aktuelle Version unterstützen, nutzen Sie diese. Wenn nicht, gehört die Entscheidung demjenigen, der den Dienst verantwortet, nicht einer Suche nach einem älteren Bibliotheksdateinamen.

Optionale Arbeitsplatz-Komponenten haben ebenfalls ihre Anforderungen. Ein Kommandozeilenziel, das sich sauber konfiguriert, sagt nichts darüber, ob das GUI-Toolkit und der Editor bauen, also behandeln Sie eine alte Qt-Paketliste als Geschichte und nicht als Spezifikation. Prüfen Sie die eigenen Optionen der Quellrevision, welche Schnittstellen standardmäßig aktiviert sind. Bauen Sie dann nur, was Sie brauchen, denn jede optionale Abhängigkeit ist ein weiteres Suchproblem, das darauf wartet zu passieren.

Ähnliche Artikel