Чаму каманда openssl працуе, а зборка VPN не
Працоўны бінарнік openssl нічога не кажа пра загалоўкі і бібліятэкі сувязі. Праверце пакет распрацоўкі, мэтавую архітэктуру і журнал пошуку зборкі.
Тэрмінал спакойна паведамляе версію OpenSSL, а дрэва зыходнікаў усё яшчэ не збіраецца з паведамленнем пра адсутныя загалоўкі крыптаграфіі. Абодва сцвярджэнні праўдзівыя адначасова, бо праграма часу выканання і набор уваходных даных зборкі пастаўляюцца асобна. Выканайце гэтыя чатыры праверкі па парадку: усталяваныя пакеты, вывад пошуку, шляхі пошуку і затым тое, ці сумяшчальны сам зыходнік. Спыніцеся на першай праверцы, якая тлумачыць збой, замест таго каб устаўляць стары спіс залежнасцей.
Час выканання і ўваходныя даныя зборкі — гэта розныя пакеты
Дыстрыбутыў дзеліць OpenSSL на пакет часу выканання, які дае агульную бібліятэку і інструмент каманднага радка, і пакет распрацоўкі, які дае загалоўкі, безверсійныя імёны сувязі і метаданыя pkg-config. Усталяванне першага не ўсталёўвае другога, і кампілятару патрэбна толькі другое.
Праверце, што фактычна прысутнічае, а не тое, што вы памятаеце пра ўсталяванне. У сістэмах на аснове Debian пакет распрацоўкі звычайна libssl-dev, а час выканання — гэта версійны пакет бібліятэкі плюс бінарнік openssl.
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
Першая каманда паказвае, які з трох усталяваны, другая паведамляе версію, якую сістэма зборкі знойдзе праз pkg-config, а трэцяя паведамляе версію часу выканання. Адсутны радок у першым вывадзе адразу тлумачыць памылку. Разыходжанне версій паміж другой і трэцяй — іншая праблема, і звычайна яно азначае, што дзве ўсталёўкі канкуруюць.
Чытайце ўласны вывад пошуку зборкі
Большасць збояў бачныя ў журнале канфігурацыі, калі прачытаць яго да зводкі. Модуль FindOpenSSL у CMake паведамляе, які каталог уключэння і якія бібліятэкі ён знайшоў, і церпіць збой з канкрэтным паведамленнем, калі патрабаваны кампанент адсутнічае.
Пацвердзіце, якую версію модуля выкарыстоўвае праект, бо ўбудаваная копія ў дрэве зыходнікаў можа паводзіць сябе інакш, чым тая, што пастаўляецца з усталяваным CMake. Затым прачытайце спіс кампанентаў: праект, які просіць толькі Crypto, не патрабуе бібліятэкі SSL, а праект, які просіць SSL, збаіць, калі прысутнічае толькі частка пакета распрацоўкі.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
Першая каманда пераконфігуруе з нуля, а другая паказвае кэшаваныя вынікі, уключаючы любы каранёвы каталог або шлях да бібліятэкі, на якім спыніўся модуль. Калі кэш паказвае на стары прэфікс з папярэдняй спробы, выдаліце каталог зборкі і сканфігуруйце зноў, а не рэдагуйце значэнні ўручную. Састарэлыя запісы кэша — частая прычына збою, які перажывае правільнае выпраўленне.
Накіруйце зборку на патрэбную ўсталёўку вузка
Калі ўхвалены OpenSSL знаходзіцца па-за прадвызначаным шляхам пошуку, FindOpenSSL дакументуе OPENSSL_ROOT_DIR як падказку менавіта для гэтай зборкі. У Unix-падобных сістэмах ён таксама звяртаецца да pkg-config, таму адпаведны PKG_CONFIG_PATH можа дапамагчы, нічога не змяняючы глабальна.
cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release ldd build/vpn_client | grep -i ssl
Першая каманда абмяжоўвае падказку адным каталогам зборкі, а другая паказвае, якую агульную бібліятэку зроблены бінарнік загрузіць у час выканання. Зборка, якая звязваецца з патрэбным прэфіксам, і бінарнік, які загружае іншы, — гэта праблема шляху часу выканання, а не праблема пошуку, і яна патрабуе рашэння пра rpath або канфігурацыю загрузчыка, а не чарговы сцяг канфігурацыі.
Трымайце гэтыя выбары лакальнымі для зборкі. Замена сістэмных бібліятэк або рэдагаванне глабальных файлаў pkg-config, каб дагадзіць аднаму праекту, — гэта шлях ад працоўнага працоўнага стала да зламанага. Каталог зборкі, які фіксуе прэфікс, узнаўляльны; змяненне на ўсю машыну — гэта інцыдэнт падтрымкі, які чакае наступнага праекта. Выдаляйце каталог зборкі, калі змяняеце падказку, каб кэш не мог захаваць стары адказ.
Ведайце, калі праблема ў самім зыходніку
Паспяховы крок канфігурацыі даказвае толькі тое, што праверкі завяршыліся. Кампіляцыя ўсё яшчэ можа адхіліць API, якога чакае зыходнік, а сувязь можа збаіць з-за адсутнага сімвала. Захоўвайце першую канкрэтную памылку з кожнага этапу, бо наступныя звычайна з’яўляюцца следствам.
OpenSSL 3 абвясціў састарэлымі і выдаліў некалькі інтэрфейсаў, якія старыя кліенты VPN выкарыстоўваюць наўпрост, таму дрэва зыходнікаў той эпохі можа патрабаваць рэальных змяненняў, а не новага шляху ўключэння. Калі суправаджальнікі падтрымліваюць бягучы выпуск, выкарыстоўвайце яго. Калі не, рашэнне належыць таму, хто валодае сэрвісам, а не пошуку старога імя файла бібліятэкі.
Апцыянальныя кампаненты працоўнага стала таксама маюць свае патрабаванні. Мэта каманднага радка, якая чыста канфігуруецца, нічога не кажа пра тое, ці збяруцца набор інструментаў GUI і рэдактар, таму ставіцеся да старога спіса пакетаў Qt як да гісторыі, а не як да спецыфікацыі. Праверце ўласныя опцыі рэвізіі зыходнікаў, якія інтэрфейсы ўключаныя прадвызначана. Затым збірайце толькі тое, што трэба, бо кожная апцыянальная залежнасць — яшчэ адна праблема пошуку, якая чакае свайго часу.