c++ - find_package(OpenSSL) 无法找到特定的 libssl 版本
问题描述
我正在使用安装了 OpenSSL 版本 1.0.2k 和 0.9.8e 的 RHEL7 系统:
$ ll /usr/lib64/libssl.so*
lrwxrwxrwx 1 root root 16 Feb 28 19:32 /usr/lib64/libssl.so -> libssl.so.1.0.2k
-rwxr-xr-x 1 root root 340832 Mar 4 2016 /usr/lib64/libssl.so.0.9.8e
-rwxr-xr-x 1 root root 470360 Apr 9 2019 /usr/lib64/libssl.so.1.0.2k
lrwxrwxrwx 1 root root 16 Feb 28 19:31 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k
lrwxrwxrwx 1 root root 16 Jun 22 2018 /usr/lib64/libssl.so.6 -> libssl.so.0.9.8e
出于兼容性原因,我的程序需要链接到旧的 0.9.8e 版本,但find_package()
对于 OpenSSL似乎无法找到它。如果我使用find_package(OpenSSL 0.9.8 REQUIRED COMPONENTS SSL Crypto)
它会找到更新的版本:
-- Found OpenSSL: /usr/lib64/libcrypto.so (found suitable version "1.0.2k", minimum required is "0.9.8") found components: SSL Crypto
如果我添加该EXACT
选项,CMake 会告诉我找不到该版本:
CMake Error at /path/to/cmake/data/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR: Found unsuitable version "1.0.2k", but
required is exact version "0.9.8" (found /usr/lib64/libcrypto.so)
查看输出很明显,FindOpenSSL.cmake
只查看指向较新库的符号链接。提供OPENSSL_ROOT_DIR
也不是选项,因为两个库都位于同一目录中。是否可以告诉命令查找特定的库/SONAME?
我不想直接链接到正确的库。我应该向 KitWare 报告错误吗?对我来说,这方面的命令似乎被破坏了。
解决方案
我建议您升级您的应用程序以与 openssl 1.0.x 或 1.1.x 兼容。
话虽如此,本着回答这个问题的精神,您可以执行以下操作:
mkdir $HOME/openssl0.9.8e && cd $_
wget http://vault.centos.org/5.11/os/x86_64/CentOS/openssl-0.9.8e-27.el5_10.4.x86_64.rpm
wget http://vault.centos.org/5.11/os/x86_64/CentOS/openssl-devel-0.9.8e-27.el5_10.4.x86_64.rpm
for i in *.rpm; do rpm2cpio $i | cpio -idmv; done
cd ..
# If you are using CMake 2.x
cmake -S /path/to/your/project -Bbuild \
-DOPENSSL_INCLUDE_DIR=$HOME/openssl0.9.8e/usr/include \
-DOPENSSL_SSL_LIBRARY=$HOME/openssl0.9.8e/usr/lib64/libssl.so \
-DOPENSSL_CRYPTO_LIBRARY=$HOME/openssl0.9.8e/usr/lib64/libcrypto.so
# If you are using CMake 3.x
cmake3 -S /path/to/your/project -Bbuild -DOPENSSL_ROOT_DIR=$HOME/openssl0.9.8e/usr
OPENSSL_ROOT_DIR
由于仅在 3.x 中可用的修复程序,因此无法与 2.x 一起正确使用。
CMakeLists.txt 的示例内容:
cmake_minimum_required(VERSION 3.0.0)
project(so)
find_package(OpenSSL 0.9.8 REQUIRED COMPONENTS SSL Crypto EXACT)
add_executable(main main.x.c)
target_link_libraries(main PRIVATE ${OPENSSL_LIBRARIES})
target_include_directories(main PRIVATE ${OPENSSL_INCLUDE_DIR})
要在构建后运行二进制文件,您可以安装 compat 包:openssl098e
在 CentOS7/RHEL7 上或使用:
LD_LIBRARY_PATH=$HOME/openssl0.9.8e/lib64 /path/to/build/main
请注意,您还需要安装krb5-devel
,因为它是使用libssl
.
您还可以将库与您的应用程序一起提供并包含$ORIGIN
在 中RPATH
,但我将把它作为一个练习(为了好玩)并且强烈不推荐它,因为您应该更新您的应用程序以使其与 openssl 1.0.x 或 1.1 兼容。 x 并且由于您永远不会获得 0.9.8 库的任何更新,因此这是一个巨大的安全问题。