Hvorfor openssl-kommandoen virker, men VPN-bygget feiler
En fungerende openssl-binær sier ingenting om headere og lenkebiblioteker. Sjekk utviklingspakken, målarkitekturen og byggets søkelogg.
Terminalen melder gladelig en OpenSSL-versjon, og kildekodetreet feiler fortsatt med en melding om manglende kryptohoder. Begge påstandene er sanne samtidig, fordi et kjøretidsverktøy og et sett bygge-inndata leveres separat. Utfør disse fire kontrollene i rekkefølge: installerte pakker, søkeutdata, søkebaner og til slutt om kilden selv er kompatibel. Stopp ved den første som forklarer feilen i stedet for å lime inn en gammel avhengighetsliste.
Kjøretid og bygge-inndata er forskjellige pakker
En distribusjon deler OpenSSL i en kjøretidspakke som leverer det delte biblioteket og kommandolinjeverktøyet, og en utviklingspakke som leverer headere, uversjonerte lenkenavn og pkg-config-metadata. Å installere den første installerer ikke den andre, og kompilatoren trenger bare den andre.
Sjekk hva som faktisk finnes, ikke hva du husker at du installerte. På Debian-baserte systemer er utviklingspakken vanligvis libssl-dev, mens kjøretiden er en versjonert bibliotekpakke pluss openssl-binæren.
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
Den første kommandoen viser hvilken av de tre som er installert, den andre rapporterer versjonen byggesystemet oppdager via pkg-config, og den tredje rapporterer kjøretidsversjonen. En manglende linje i den første utdataen forklarer feilen umiddelbart. En versjonsforskjell mellom den andre og den tredje er et annet problem, og betyr vanligvis at to installasjoner kjemper om plassen.
Les byggets egen søkeutdata
De fleste feilene er synlige i konfigurasjonsloggen dersom du leser den før oppsummeringen. FindOpenSSL-modulen i CMake rapporterer hvilken include-katalog og hvilke biblioteker den fant, og den feiler med en konkret melding når en nødvendig komponent mangler.
Bekreft hvilken modulversjon prosjektet bruker, fordi en kopi som ligger inne i kildekodetreet kan oppføre seg annerledes enn den som følger med den installerte CMake. Les så komponentlisten: et prosjekt som bare ber om Crypto trenger ikke SSL-biblioteket, og et som ber om SSL vil feile hvis bare deler av utviklingspakken er til stede.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
Den første kommandoen konfigurerer på nytt fra bunnen, og den andre viser de mellomlagrede resultatene, inkludert den rotkatalogen eller bibliotekstien modulen landet på. Hvis mellomlageret peker på et gammelt prefiks fra et tidligere forsøk, slett byggemappen og konfigurer på nytt i stedet for å redigere verdier for hånd. Utdaterte oppføringer i mellomlageret er en vanlig årsak til en feil som overlever en riktig rettelse.
Pek bygget mot den riktige installasjonen, smalt
Når en godkjent OpenSSL ligger utenfor standard søkebane, dokumenterer FindOpenSSL OPENSSL_ROOT_DIR som et hint for akkurat dette bygget. På Unix-lignende systemer spør den også pkg-config, så en passende PKG_CONFIG_PATH kan hjelpe uten å endre noe 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 kommandoen begrenser hintet til én byggemappe, og den andre viser hvilket delt bibliotek den ferdige binæren laster under kjøring. Et bygg som lenker mot det tiltenkte prefikset, og en binær som laster et annet, er et kjøretidsproblem for stien, ikke et søkeproblem, og det krever en avgjørelse om rpath eller lasterkonfigurasjon i stedet for nok et konfigurasjonsflagg.
Hold disse valgene lokale for bygget. Å erstatte systembiblioteker eller redigere globale pkg-config-filer for å tilfredsstille ett prosjekt er måten et velfungerende skrivebord blir et ødelagt et. En byggemappe som registrerer prefikset, er reproduserbar; en endring for hele maskinen er en støttesak som venter på neste prosjekt. Slett byggemappen når du endrer hintet, slik at mellomlageret ikke kan beholde det gamle svaret.
Vet når kilden er problemet
Et vellykket konfigurasjonstrinn beviser bare at kontrollene ble fullført. Kompileringen kan fortsatt avvise et API som kilden forventer, og lenkingen kan fortsatt feile på et manglende symbol. Ta vare på den første konkrete feilen fra hvert trinn, siden de senere vanligvis er konsekvenser.
OpenSSL 3 erklærte flere grensesnitt som utdaterte og fjernet dem, grensesnitt som eldre VPN-klienter bruker direkte, så et kildekodetre fra den tiden kan trenge reelle endringer i stedet for en ny include-bane. Hvis vedlikeholderne støtter en gjeldende utgivelse, bruk den. Hvis ikke, hører avgjørelsen til den som eier tjenesten, ikke til en leting etter et eldre bibliotekfilnavn.
Valgfrie skrivebordskomponenter har også sine egne krav. Et kommandolinjemål som konfigurerer rent, sier ingenting om hvorvidt GUI-verktøysettet og editoren bygges, så behandle en gammel Qt-pakkeliste som historie og ikke som spesifikasjon. Sjekk kildeversjonens egne valg for hvilke grensesnitt som er aktivert som standard. Bygg deretter bare det du trenger, fordi hver valgfri avhengighet er nok et søkeproblem som venter på å skje.