为什么本地安装OpenSSL后,Rust构建openssl-sys v0.9.60仍然报错?
核心错误原因
- 你搞混了OpenSSL编译配置的两个路径的作用:
--openssldir=/usr/local/ssl这个参数指定的是证书、加密配置文件的存放目录,不是OpenSSL程序库、头文件的安装根目录- OpenSSL编译时如果没显式指定
--prefix,库和头文件默认会装到/usr/local/lib(部分64位系统是/usr/local/lib64)、/usr/local/include路径下,根本不会在/usr/local/ssl下面创建lib子目录,这就是构建脚本报OpenSSL library directory does not exist: /usr/local/ssl/lib的直接原因。
- 你之前给Anaconda下的openssl二进制去掉执行权限的操作完全无效:
openssl-sys是Rust侧的系统绑定,构建时直接链接磁盘上的静态/动态库文件,根本不会调用PATH路径里的openssl可执行程序,这个操作不仅解决不了问题,还可能打乱Anaconda环境本身的依赖关系。
修复操作步骤
- 先清掉之前配错的环境变量,避免后续路径查找冲突:
unset OPENSSL_DIR - 先定位你本地编译的OpenSSL实际的文件位置,别靠猜:
- 找头文件执行:
find /usr/local -name "ssl.h",能匹配到xxx/openssl/ssl.h的话,前面的xxx就是OPENSSL_INCLUDE_DIR要填的路径 - 找库文件执行:
find /usr/local -name "libssl.so",能匹配到的文件所在目录,就是OPENSSL_LIB_DIR要填的路径
- 找头文件执行:
- 给Rust构建脚本指定明确的库、头文件路径(比只设
OPENSSL_DIR靠谱,不会因为子目录结构错配找不到文件):# 路径替换成你上一步查出来的实际值 export OPENSSL_LIB_DIR=/usr/local/lib64 export OPENSSL_INCLUDE_DIR=/usr/local/include - 更新动态库加载缓存,避免程序编译完运行时找不到链接的库:
echo "/usr/local/lib64" | sudo tee /etc/ld.so.conf.d/local-openssl.conf sudo ldconfig - 清掉之前失败的openssl-sys构建缓存,重新编译:
cargo clean -p openssl-sys cargo run
更省事的替代方案
完全没必要从源码编译OpenSSL,直接用系统包管理器装官方提供的开发包就能覆盖开发需求:
- Debian/Ubuntu 系列:执行
sudo apt install libssl-dev pkg-config - RHEL/Fedora/CentOS 系列:执行
sudo dnf install openssl-devel pkg-config
装完不需要额外配置环境变量,直接就能正常编译需要openssl-sys的Rust项目。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

