如何为最新版qpdf指定本地非标准路径的OpenSSL以完成安装?
如何为qpdf v11.5.0指定非标准路径的本地编译OpenSSL?
问题背景
编译qpdf v11.5.0时,需要使用位于/opt/openssl3的本地编译OpenSSL,尝试使用以下命令指定路径后编译失败:
cmake -DREQUIRE_CRYPTO_OPENSSL=1 -DOPENSSL_H_PATH=/opt/openssl3/include -DOPENSSL_LIB_PATH=/opt/openssl3/lib64 -S . -B build cmake --build build -- -k
报错信息示例:
../libqpdf/libqpdf.so.29.5.0: undefined reference to `EVP_CIPHER_CTX_set_key_length'
错误原因是编译过程未正确使用指定路径的OpenSSL,而是链接了系统默认版本。
解决方案
qpdf的CMake构建脚本依赖CMake官方的FindOpenSSL模块,而非自定义的OPENSSL_H_PATH/OPENSSL_LIB_PATH变量,因此需要使用标准的CMake变量来指定OpenSSL路径:
清理旧构建缓存
先删除之前的build目录,避免缓存残留影响新配置:rm -rf build使用标准CMake变量指定OpenSSL路径
有两种推荐方式:- 方式一:指定OpenSSL根目录(CMake会自动从该目录搜索头文件和库)
cmake -DREQUIRE_CRYPTO_OPENSSL=1 -DOPENSSL_ROOT_DIR=/opt/openssl3 -S . -B build - 方式二:手动指定头文件目录和库文件路径(适用于根目录结构非标准的情况)
cmake -DREQUIRE_CRYPTO_OPENSSL=1 \ -DOPENSSL_INCLUDE_DIR=/opt/openssl3/include \ -DOPENSSL_LIBRARIES="/opt/openssl3/lib64/libssl.so;/opt/openssl3/lib64/libcrypto.so" \ -S . -B build
- 方式一:指定OpenSSL根目录(CMake会自动从该目录搜索头文件和库)
执行编译
运行编译命令:cmake --build build可选:确保运行时能找到OpenSSL库
如果编译后运行qpdf时提示找不到OpenSSL库,可以通过以下两种方式解决:- 临时设置环境变量:
export LD_LIBRARY_PATH=/opt/openssl3/lib64:$LD_LIBRARY_PATH - 编译时指定RPATH(永久生效):
在CMake命令中添加以下参数:-DCMAKE_INSTALL_RPATH=/opt/openssl3/lib64 -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
- 临时设置环境变量:
为什么之前的命令无效?
qpdf的libqpdf/CMakeLists.txt并未定义OPENSSL_H_PATH和OPENSSL_LIB_PATH这两个自定义变量,因此你传入的参数不会被构建脚本识别,CMake依然使用系统默认的OpenSSL路径,导致链接到版本不兼容的库,出现未定义引用错误。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

