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