Miksi openssl-komento toimii mutta VPN:n koontiversio epäonnistuu
Toimiva openssl-binääri ei kerro mitään otsikkotiedostoista ja linkityskirjastoista. Tarkista kehityspaketti, kohdearkkitehtuuri ja koontiversion hakuloki.
Pääte ilmoittaa mielellään OpenSSL-version, ja lähdehakemisto epäonnistuu silti viestillä puuttuvista krypto-otsikoista. Molemmat väitteet pitävät yhtä aikaa paikkansa, koska ajonaikainen työkalu ja joukko koontiversion syötteitä toimitetaan erikseen. Käy nämä neljä tarkistusta järjestyksessä läpi: asennetut paketit, hakulokituloste, hakupolut ja lopuksi se, onko lähde itse yhteensopiva. Pysähdy ensimmäiseen tarkistukseen, joka selittää epäonnistumisen, sen sijaan että liittäisit vanhan riippuvuusluettelon.
Ajonaikainen ympäristö ja koontiversion syötteet ovat eri paketteja
Jakelu jakaa OpenSSL:n ajonaikaiseen pakettiin, joka tarjoaa jaetun kirjaston ja komentorivityökalun, sekä kehityspakettiin, joka tarjoaa otsikkotiedostot, versioimattomat linkitysnimet ja pkg-configin metatiedot. Ensimmäisen asentaminen ei asenna toista, ja kääntäjä tarvitsee vain toisen.
Tarkista, mitä todella on läsnä, älä sitä mitä muistat asentaneesi. Debian-pohjaisissa järjestelmissä kehityspaketti on yleensä libssl-dev, kun taas ajonaikainen on versioitu kirjastopaketti sekä openssl-binääri.
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
Ensimmäinen komento näyttää, mikä kolmesta on asennettu, toinen ilmoittaa version, jonka koontijärjestelmä löytää pkg-configin kautta, ja kolmas ilmoittaa ajonaikaisen version. Puuttuva rivi ensimmäisessä tulosteessa selittää virheen heti. Version poikkeama toisen ja kolmannen välillä on eri ongelma, ja se tarkoittaa yleensä, että kaksi asennusta kilpailee.
Lue koontiversion oma hakulokituloste
Useimmat epäonnistumiset näkyvät määrityslokissa, jos luet sen ennen yhteenvetoa. CMaken FindOpenSSL-moduuli ilmoittaa, minkä include-hakemiston ja mitkä kirjastot se löysi, ja se epäonnistuu tiettyyn viestiin, kun vaadittu osa puuttuu.
Varmista, mitä moduuliversiota projekti käyttää, koska lähdehakemiston sisään pakattu kopio voi käyttäytyä eri tavalla kuin asennetun CMaken mukana toimitettu. Lue sitten osaluettelo: projekti, joka pyytää vain Cryptoa, ei tarvitse SSL-kirjastoa, ja SSL:ää pyytävä epäonnistuu, jos kehityspaketista on läsnä vain osa.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
Ensimmäinen komento määrittää alusta asti uudelleen, ja toinen näyttää välimuistiin tallennetut tulokset, mukaan lukien juurihakemisto tai kirjastopolku, johon moduuli päätyi. Jos välimuisti osoittaa aiemmasta yrityksestä jääneeseen vanhaan etuliitteeseen, poista koontihakemisto ja määritä uudelleen sen sijaan että muokkaisit arvoja käsin. Vanhentuneet välimuistimerkinnät ovat yleinen syy epäonnistumiselle, joka säilyy oikean korjauksen jälkeen.
Suuntaa koontiversio oikeaan asennukseen kapeasti
Kun hyväksytty OpenSSL sijaitsee oletushakupolun ulkopuolella, FindOpenSSL dokumentoi muuttujan OPENSSL_ROOT_DIR vihjeeksi juuri tälle koontiversiolle. Unix-tyyppisissä järjestelmissä se kysyy myös pkg-configia, joten sopiva PKG_CONFIG_PATH voi auttaa muuttamatta mitään maailmanlaajuisesti.
cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release ldd build/vpn_client | grep -i ssl
Ensimmäinen komento rajaa vihjeen yhteen koontihakemistoon, ja toinen näyttää, minkä jaetun kirjaston tuloksena oleva binääri lataa ajon aikana. Koontiversio, joka linkittyy aiottuun etuliitteeseen, ja binääri, joka lataa toisen, on ajonaikaisen polun ongelma, ei hakujen ongelma, ja se vaatii rpathia tai lataajan määritystä koskevan päätöksen eikä uutta määritysvalitsinta.
Pidä nämä valinnat paikallisina koontiversiossa. Järjestelmäkirjastojen korvaaminen tai globaalien pkg-config-tiedostojen muokkaaminen yhden projektin miellyttämiseksi on tie siihen, että toimivasta työpöydästä tulee rikki. Etuliitteen kirjaava koontihakemisto on toistettava; koneenlaajuinen muutos on tukitapaus, joka odottaa seuraavaa projektia. Poista koontihakemisto, kun muutat vihjettä, jotta välimuisti ei voi säilyttää vanhaa vastausta.
Tiedä, milloin ongelma on lähteessä
Onnistunut määritysvaihe todistaa vain, että tarkistukset ovat valmistuneet. Kääntäminen voi silti hylätä API:n, jota lähde odottaa, ja linkitys voi silti epäonnistua puuttuvan symbolin vuoksi. Tallenna kunkin vaiheen ensimmäinen yksilöity virhe, koska myöhemmät ovat yleensä seurauksia.
OpenSSL 3 merkitsi vanhentuneiksi ja poisti useita rajapintoja, joita vanhemmat VPN-asiakkaat käyttävät suoraan, joten tuon aikakauden lähdehakemisto voi vaatia todellisia muutoksia uuden include-polun sijaan. Jos ylläpitäjät tukevat nykyistä julkaisua, käytä sitä. Jos eivät, päätös kuuluu palvelun omistajalle, ei vanhemman kirjastotiedoston nimen etsimiselle.
Valinnaisilla työpöytäosilla on myös omat vaatimuksensa. Siististi määrittyvä komentorivikohde ei kerro mitään siitä, kääntyvätkö GUI-työkalupakki ja editori, joten kohtele vanhaa Qt-pakettiluetteloa historiana äläkä määritelmänä. Tarkista lähdeversion omista valinnoista, mitkä rajapinnat ovat oletuksena käytössä. Rakenna sitten vain se, mitä tarvitset, koska jokainen valinnainen riippuvuus on uusi hakujen ongelma, joka odottaa tapahtumistaan.