端末は快く OpenSSL のバージョンを報告しますが、ソースツリーは暗号ヘッダーが見つからないというメッセージで失敗し続けます。どちらも同時に正しいのは、実行時ツールとビルド入力の集合が別々に配布されるからです。次の四つの確認を順に行ってください:インストール済みパッケージ、検出出力、検索パス、そしてソース自体が互換かどうかです。古い依存関係の一覧を貼り付けるのではなく、失敗を説明する最初の確認で止めてください。

実行環境とビルド入力は別のパッケージ

ディストリビューションは OpenSSL を、共有ライブラリーとコマンドラインツールを提供する実行時パッケージと、ヘッダー、バージョンなしのリンク名、pkg-config メタデータを提供する開発パッケージに分けます。前者をインストールしても後者はインストールされず、コンパイラーが必要とするのは後者だけです。

インストールした記憶ではなく、実際に何が存在するかを確認してください。Debian 系のシステムでは開発パッケージは通常 libssl-dev で、実行時側はバージョン付きのライブラリーパッケージと openssl バイナリーです。

dpkg -l | grep -E 'libssl-dev|libssl3|openssl'
pkg-config --modversion openssl
openssl version

最初のコマンドは三つのうちどれがインストール済みかを示し、二番目はビルドシステムが pkg-config 経由で検出するバージョンを報告し、三番目は実行時のバージョンを報告します。最初の出力に欠けている行があれば、それがエラーを直ちに説明します。二番目と三番目のバージョンの不一致は別の問題で、通常は二つのインストールが競合していることを意味します。

ビルド自身の検出出力を読む

要約の前に読めば、ほとんどの失敗は構成ログに現れます。CMake の FindOpenSSL モジュールは、見つけたインクルードディレクトリーとライブラリーを報告し、必須コンポーネントが欠けているときは具体的なメッセージで失敗します。

プロジェクトがどのモジュールバージョンを使っているか確認してください、ソースツリー内に同梱された複製はインストール済みの 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 パッケージ一覧は仕様ではなく履歴として扱ってください。どのインターフェースが既定で有効かはソースリビジョン自身のオプションで確認し、そのうえで必要なものだけをビルドしてください。任意の依存関係はどれも、起こるのを待っている別の検出問題です。

関連記事