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

Схожі статті