Terminal vui vẻ báo một phiên bản OpenSSL, còn cây mã nguồn vẫn thất bại với thông báo về các tiêu đề mã hóa bị thiếu. Cả hai khẳng định đều đúng cùng lúc, vì công cụ thời gian chạy và một tập đầu vào dựng được phân phối riêng. Hãy làm bốn kiểm tra này theo thứ tự: gói đã cài, đầu ra dò tìm, đường dẫn tìm kiếm, và cuối cùng là bản thân mã nguồn có tương thích không. Dừng ở kiểm tra đầu tiên giải thích được lỗi thay vì dán một danh sách phụ thuộc cũ.

Thời gian chạy và đầu vào dựng là những gói khác nhau

Một bản phân phối chia OpenSSL thành gói thời gian chạy cung cấp thư viện chia sẻ và công cụ dòng lệnh, và gói phát triển cung cấp tiêu đề, tên liên kết không có phiên bản và siêu dữ liệu pkg-config. Cài gói thứ nhất không cài gói thứ hai, và trình biên dịch chỉ cần gói thứ hai.

Hãy kiểm tra thứ thực sự có mặt thay vì thứ bạn nhớ đã cài. Trên các hệ thống dựa trên Debian gói phát triển thường là libssl-dev, còn thời gian chạy là một gói thư viện có phiên bản cộng với tệp nhị phân openssl.

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

Lệnh đầu tiên cho biết gói nào trong ba gói đã cài, lệnh thứ hai báo phiên bản mà hệ thống dựng sẽ tìm thấy qua pkg-config, và lệnh thứ ba báo phiên bản thời gian chạy. Một dòng thiếu trong đầu ra đầu tiên giải thích lỗi ngay lập tức. Sự lệch phiên bản giữa lệnh thứ hai và thứ ba là vấn đề khác, và thường có nghĩa là hai bản cài đang cạnh tranh.

Đọc chính đầu ra dò tìm của bản dựng

Hầu hết các thất bại đều hiện trong nhật ký cấu hình nếu bạn đọc trước phần tóm tắt. Mô-đun FindOpenSSL của CMake báo thư mục include và các thư viện mà nó tìm thấy, và nó thất bại với thông báo cụ thể khi thiếu một thành phần bắt buộc.

Xác nhận dự án dùng phiên bản mô-đun nào, vì một bản sao được đóng gói bên trong cây mã nguồn có thể hành xử khác bản được cung cấp cùng CMake đã cài. Sau đó đọc danh sách thành phần: dự án chỉ yêu cầu Crypto không cần thư viện SSL, và dự án yêu cầu SSL sẽ thất bại nếu chỉ có một phần của gói phát triển.

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
grep -i -E 'openssl|ssl' build/CMakeCache.txt

Lệnh đầu tiên cấu hình lại từ đầu, và lệnh thứ hai hiển thị kết quả trong bộ nhớ đệm, gồm cả thư mục gốc hoặc đường dẫn thư viện mà mô-đun đã chọn. Nếu bộ nhớ đệm trỏ tới một tiền tố cũ từ lần thử trước, hãy xoá thư mục dựng và cấu hình lại thay vì sửa giá trị bằng tay. Các mục bộ nhớ đệm cũ là nguyên nhân phổ biến của thất bại vẫn tồn tại sau một bản sửa đúng.

Hướng bản dựng tới đúng bản cài, một cách hẹp

Khi một OpenSSL đã được phê duyệt nằm ngoài đường dẫn tìm kiếm mặc định, FindOpenSSL ghi nhận OPENSSL_ROOT_DIR như một gợi ý cho chính bản dựng đó. Trên các hệ thống kiểu Unix nó cũng hỏi pkg-config, nên một PKG_CONFIG_PATH phù hợp có thể giúp mà không thay đổi gì trên toàn cục.

cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release
ldd build/vpn_client | grep -i ssl

Lệnh đầu tiên giới hạn gợi ý trong một thư mục dựng, và lệnh thứ hai cho thấy tệp nhị phân tạo ra sẽ nạp thư viện chia sẻ nào khi chạy. Một bản dựng liên kết với tiền tố dự định và một tệp nhị phân nạp tiền tố khác là vấn đề đường dẫn thời gian chạy, không phải vấn đề dò tìm, và nó cần quyết định về rpath hoặc cấu hình trình nạp thay vì thêm một cờ cấu hình.

Giữ những lựa chọn này cục bộ cho bản dựng. Thay thế thư viện hệ thống hoặc sửa tệp pkg-config toàn cục để làm hài lòng một dự án là con đường khiến một màn hình làm việc đang chạy trở nên hỏng. Một thư mục dựng ghi lại tiền tố thì có thể tái tạo; một thay đổi trên toàn máy là sự cố hỗ trợ đang chờ dự án tiếp theo. Xoá thư mục dựng khi bạn đổi gợi ý, để bộ nhớ đệm không thể giữ câu trả lời cũ.

Biết khi nào mã nguồn là vấn đề

Một bước cấu hình thành công chỉ chứng minh các kiểm tra đã xong. Việc biên dịch vẫn có thể từ chối một API mà mã nguồn mong đợi, và việc liên kết vẫn có thể thất bại vì thiếu một ký hiệu. Hãy giữ lỗi cụ thể đầu tiên của mỗi giai đoạn, vì những lỗi sau thường là hệ quả.

OpenSSL 3 đã đánh dấu lỗi thời và loại bỏ một số giao diện mà các ứng dụng VPN cũ dùng trực tiếp, nên một cây mã nguồn từ thời đó có thể cần thay đổi thật sự thay vì một đường dẫn include mới. Nếu những người bảo trì hỗ trợ một bản phát hành hiện hành, hãy dùng bản đó. Nếu không, quyết định thuộc về người sở hữu dịch vụ, không phải việc tìm một tên tệp thư viện cũ hơn.

Các thành phần màn hình làm việc tuỳ chọn cũng có yêu cầu riêng. Một mục tiêu dòng lệnh cấu hình sạch sẽ không nói gì về việc bộ công cụ GUI và trình soạn thảo có dựng được hay không, nên hãy coi một danh sách gói Qt cũ như lịch sử chứ không phải đặc tả. Kiểm tra các tuỳ chọn của chính bản sửa đổi mã nguồn để biết giao diện nào được bật mặc định. Sau đó chỉ dựng những gì bạn cần, vì mỗi phụ thuộc tuỳ chọn là một vấn đề dò tìm khác đang chờ xảy ra.

Bài viết liên quan