Terminalen rapporterer gladelig en OpenSSL-version, og kildetræet fejler stadig med en meddelelse om manglende krypto-headere. Begge udsagn er sande samtidig, fordi et runtime-værktøj og et sæt build-input leveres hver for sig. Kør disse fire kontroller i rækkefølge: installerede pakker, fund-output, søgestier og til sidst, om selve kilden er kompatibel. Stop ved den første, der forklarer fejlen, i stedet for at indsætte en gammel afhængighedsliste.

Runtime og build-input er forskellige pakker

En distribution deler OpenSSL i en runtime-pakke, der leverer det delte bibliotek og kommandolinjeværktøjet, og en udviklingspakke, der leverer headere, uversionerede linknavne og pkg-config-metadata. At installere den første installerer ikke den anden, og compileren har kun brug for den anden.

Tjek, hvad der faktisk er til stede, i stedet for hvad du husker at have installeret. På Debian-baserede systemer er udviklingspakken normalt libssl-dev, mens runtime er en versioneret bibliotekspakke plus openssl-binæren.

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

Den første kommando viser, hvilken af de tre der er installeret, den anden rapporterer den version, som build-systemet finder via pkg-config, og den tredje rapporterer runtime-versionen. En manglende linje i det første output forklarer fejlen med det samme. En versionsforskel mellem den anden og den tredje er et andet problem og betyder normalt, at to installationer konkurrerer.

Læs buildets eget fund-output

De fleste fejl er synlige i konfigureringsloggen, hvis du læser den før opsummeringen. CMakes FindOpenSSL-modul rapporterer, hvilken include-mappe og hvilke biblioteker den fandt, og den fejler med en specifik meddelelse, når en påkrævet komponent mangler.

Bekræft, hvilken modulversion projektet bruger, fordi en medfølgende kopi inde i kildetræet kan opføre sig anderledes end den, der leveres med det installerede CMake. Læs derefter komponentlisten: et projekt, der kun beder om Crypto, har ikke brug for SSL-biblioteket, og et, der beder om SSL, fejler, hvis kun en del af udviklingspakken er til stede.

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

Den første kommando konfigurerer forfra, og den anden viser de cachede resultater, inklusive enhver rodmappe eller bibliotekssti, som modulet landede på. Hvis cachen peger på et gammelt præfiks fra et tidligere forsøg, så slet build-mappen og konfigurer igen i stedet for at redigere værdier manuelt. Forældede cache-poster er en almindelig årsag til en fejl, der overlever en korrekt rettelse.

Ret buildet mod den rigtige installation, snævert

Når en godkendt OpenSSL ligger uden for standardsøgestien, dokumenterer FindOpenSSL OPENSSL_ROOT_DIR som et hint til netop det build. På Unix-lignende systemer konsulterer den også pkg-config, så en passende PKG_CONFIG_PATH kan hjælpe uden at ændre noget globalt.

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

Den første kommando begrænser hintet til én build-mappe, og den anden viser, hvilket delt bibliotek den resulterende binær indlæser ved kørsel. Et build, der linker mod det tilsigtede præfiks, og en binær, der indlæser et andet, er et runtime-stiproblem, ikke et fund-problem, og det kræver en beslutning om rpath eller loader-konfiguration i stedet for endnu et konfigureringsflag.

Hold disse valg lokale for buildet. At erstatte systembiblioteker eller redigere globale pkg-config-filer for at tilfredsstille ét projekt er måden, hvorpå et fungerende skrivebord bliver et ødelagt et. En build-mappe, der registrerer præfikset, er reproducerbar; en ændring for hele maskinen er en support-sag, der venter på det næste projekt. Slet build-mappen, når du ændrer hintet, så cachen ikke kan beholde det gamle svar.

Ved, hvornår kilden er problemet

Et vellykket konfigureringstrin beviser kun, at kontrollerne blev gennemført. Kompilering kan stadig afvise en API, som kilden forventer, og linkning kan stadig fejle på et manglende symbol. Gem den første specifikke fejl fra hvert trin, fordi de senere normalt er konsekvenser.

OpenSSL 3 forældede og fjernede flere grænseflader, som ældre VPN-klienter bruger direkte, så et kildetræ fra den æra kan have brug for reelle ændringer i stedet for en ny include-sti. Hvis vedligeholderne understøtter en aktuel udgivelse, så brug den. Hvis ikke, hører beslutningen til den, der ejer tjenesten, ikke til en søgning efter et ældre biblioteksfilnavn.

Valgfrie skrivebordskomponenter har også deres egne krav. Et kommandolinjemål, der konfigurerer rent, siger intet om, hvorvidt GUI-værktøjssættet og editoren bygger, så behandl en gammel Qt-pakkeliste som historie frem for som specifikation. Tjek kilderevisionens egne indstillinger for, hvilke grænseflader der er aktiveret som standard. Byg derefter kun det, du har brug for, fordi hver valgfri afhængighed er endnu et fund-problem, der venter på at ske.

Relaterede artikler