Защо командата 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 като история, а не като спецификация. Проверете собствените опции на ревизията на изходния код за това кои интерфейси са включени по подразбиране. След това сглобете само това, което ви трябва, защото всяка незадължителна зависимост е още един проблем с откриването, който чака да се случи.