Terminal chętnie raportuje wersję OpenSSL, a drzewo źródeł nadal zawodzi z komunikatem o brakujących nagłówkach kryptograficznych. Oba stwierdzenia są prawdziwe jednocześnie, ponieważ narzędzie czasu wykonania i zestaw danych wejściowych kompilacji są dostarczane osobno. Wykonaj te cztery kontrole po kolei: zainstalowane pakiety, dane wyjściowe wyszukiwania, ścieżki wyszukiwania, a następnie to, czy sam kod źródłowy jest zgodny. Zatrzymaj się na pierwszej, która wyjaśnia błąd, zamiast wklejać starą listę zależności.

Środowisko uruchomieniowe i dane wejściowe kompilacji to różne pakiety

Dystrybucja dzieli OpenSSL na pakiet środowiska uruchomieniowego, który dostarcza bibliotekę współdzieloną i narzędzie wiersza poleceń, oraz pakiet programistyczny, który dostarcza nagłówki, nieprzywersjonowane nazwy konsolidacji i metadane pkg-config. Zainstalowanie pierwszego nie instaluje drugiego, a kompilator potrzebuje tylko drugiego.

Sprawdź, co jest rzeczywiście obecne, a nie to, co pamiętasz, że zainstalowano. W systemach opartych na Debianie pakiet programistyczny to zwykle libssl-dev, natomiast środowisko uruchomieniowe to wersjonowany pakiet biblioteki plus plik binarny openssl.

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

Pierwsze polecenie pokazuje, który z trzech jest zainstalowany, drugie raportuje wersję, którą system kompilacji znajdzie przez pkg-config, a trzecie raportuje wersję środowiska uruchomieniowego. Brakujący wiersz w pierwszym wyjściu od razu wyjaśnia błąd. Rozbieżność wersji między drugim i trzecim to inny problem i zwykle oznacza, że konkurują dwie instalacje.

Przeczytaj własne wyjście wyszukiwania kompilacji

Większość niepowodzeń jest widoczna w dzienniku konfiguracji, jeśli przeczytasz go przed podsumowaniem. Moduł FindOpenSSL CMake raportuje, który katalog include i jakie biblioteki znalazł, i zawodzi z konkretnym komunikatem, gdy brakuje wymaganego składnika.

Potwierdź, której wersji modułu używa projekt, ponieważ dołączona kopia w drzewie źródeł może zachowywać się inaczej niż ta dostarczana z zainstalowanym CMake. Następnie przeczytaj listę składników: projekt, który prosi tylko o Crypto, nie potrzebuje biblioteki SSL, a projekt proszący o SSL zawiedzie, jeśli obecna jest tylko część pakietu programistycznego.

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

Pierwsze polecenie konfiguruje od nowa, a drugie pokazuje wyniki z pamięci podręcznej, w tym katalog główny lub ścieżkę biblioteki, na której zatrzymał się moduł. Jeśli pamięć podręczna wskazuje na stary prefiks z poprzedniej próby, usuń katalog kompilacji i skonfiguruj ponownie, zamiast edytować wartości ręcznie. Nieaktualne wpisy pamięci podręcznej są częstą przyczyną błędu, który przeżywa poprawną poprawkę.

Skieruj kompilację na właściwą instalację, wąsko

Gdy zatwierdzony OpenSSL mieszka poza domyślną ścieżką wyszukiwania, FindOpenSSL dokumentuje OPENSSL_ROOT_DIR jako wskazówkę dla tej konkretnej kompilacji. W systemach uniksopodobnych konsultuje też pkg-config, więc odpowiednia PKG_CONFIG_PATH może pomóc bez zmiany czegokolwiek globalnie.

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

Pierwsze polecenie ogranicza wskazówkę do jednego katalogu kompilacji, a drugie pokazuje, którą bibliotekę współdzieloną załaduje powstały plik binarny w czasie wykonania. Kompilacja konsolidująca się z zamierzonym prefiksem i plik binarny ładujący inny to problem ścieżki czasu wykonania, a nie problem wyszukiwania, i wymaga decyzji o rpath lub konfiguracji loadera zamiast kolejnej flagi konfiguracji.

Trzymaj te wybory lokalnie dla kompilacji. Zastępowanie bibliotek systemowych lub edytowanie globalnych plików pkg-config, aby zadowolić jeden projekt, to droga, na której działający pulpit staje się zepsuty. Katalog kompilacji, który zapisuje prefiks, jest powtarzalny; zmiana w całej maszynie to incydent wsparcia czekający na następny projekt. Usuń katalog kompilacji, gdy zmieniasz wskazówkę, aby pamięć podręczna nie mogła zachować starej odpowiedzi.

Wiedz, kiedy problemem jest kod źródłowy

Udany krok konfiguracji dowodzi tylko, że kontrole się zakończyły. Kompilacja wciąż może odrzucić API, którego oczekuje źródło, a konsolidacja wciąż może zawieść z powodu brakującego symbolu. Zachowaj pierwszy konkretny błąd z każdego etapu, ponieważ późniejsze są zwykle konsekwencjami.

OpenSSL 3 uznał za przestarzałe i usunął kilka interfejsów, których starsi klienci VPN używają bezpośrednio, więc drzewo źródeł z tamtej epoki może wymagać rzeczywistych zmian, a nie nowej ścieżki include. Jeśli opiekunowie obsługują bieżące wydanie, użyj go. Jeśli nie, decyzja należy do właściciela usługi, a nie do poszukiwania starszej nazwy pliku biblioteki.

Opcjonalne komponenty pulpitu też mają swoje wymagania. Cel wiersza poleceń, który konfiguruje się czysto, nic nie mówi o tym, czy zestaw narzędzi GUI i edytor się zbudują, więc starą listę pakietów Qt traktuj jako historię, a nie specyfikację. Sprawdź we własnych opcjach rewizji źródeł, które interfejsy są domyślnie włączone. Następnie zbuduj tylko to, czego potrzebujesz, ponieważ każda opcjonalna zależność to kolejny problem wyszukiwania czekający na wystąpienie.

Powiązane artykuły