编译安装ruby提示library not found for class digest sha512 digest/sha2.so 解决

本文介绍了解决Ruby环境下digest库中SHA2.so文件缺失的方法,通过将SHA2.so文件放置于Ruby安装目录的所有digest目录下,确保所有相关模块能够正确加载,从而避免了因文件缺失导致的安装或运行错误。

#找sha2.so文件 放到ruby安装目录所有的digest目录

#不知道哪个有效就全放一份,安装成功

#复制sha2.so到安装目录

cd ruby-2.6.4

find . -name digest | xargs -i cp sha2.so {}

你运行了: ```bash grep -r "SHA_DIGEST_LENGTH" /usr/include/openssl/ ``` 得到了结果: ``` /usr/include/openssl/x509.h: unsigned char sha1_hash[SHA_DIGEST_LENGTH]; ``` 这说明:**`SHA_DIGEST_LENGTH` 确实在某个头文件中被使用了(这里是 `x509.h`),但你没有看到它的定义,并不意味着它不存在。** --- ## ✅ 正确解释这个现象 ### 🔍 为什么只在 `x509.h` 中看到引用,而没看到定义? 因为 `SHA_DIGEST_LENGTH` 的**定义不在 `x509.h` 中,而在 `sha.h` 中**。 但由于某些版本的 OpenSSL 使用“间接包含”机制 —— 即 `x509.h` 可能包含了其他头文件(比如通过 `<openssl/objects.h>` 或 `<openssl/sha.h>`)—— 所以你在 `x509.h` 中看到了对 `SHA_DIGEST_LENGTH` 的使用。 但 `grep -r` 不一定能显示 **定义的位置**,除非你明确搜索到了定义行。 --- ### ✅ 第一步:确认 `SHA_DIGEST_LENGTH` 是否真的在 `sha.h` 中定义 运行这条命令: ```bash grep "define.*SHA_DIGEST_LENGTH" /usr/include/openssl/sha.h ``` 你应该看到输出: ```c #define SHA_DIGEST_LENGTH 20 ``` 如果 **有输出**,说明宏已经正确定义 → 问题出在你的代码或编译流程。 如果 **无输出**,则说明你的 OpenSSL 头文件有问题(缺失定义)。 --- ## 🧩 常见情况分析与解决方案 ### ✅ 情况一:`sha.h` 中确实有定义(正常) 👉 输出: ```c #define SHA_DIGEST_LENGTH 20 ``` ✅ 那么你只需要确保你的 C 文件中正确包含了: ```c #include <openssl/sha.h> ``` ⚠️ 注意:不要只包含 `x509.h` 或 `ssl.h`,它们不一定直接暴露 `SHA_DIGEST_LENGTH`。 #### ❌ 错误写法: ```c #include <openssl/x509.h> // 虽然里面用了 SHA_DIGEST_LENGTH,但不一定引入 sha.h! ``` #### ✅ 正确写法: ```c #include <openssl/sha.h> // 明确包含 SHA 相关定义 #include <openssl/x509.h> // 如果你也需要 X.509 结构 ``` --- ### ✅ 情况二:`sha.h` 中没有 `#define SHA_DIGEST_LENGTH` 运行上面的 `grep` 命令后无输出? 那你可能遇到以下几种异常情况: | 原因 | 解决方法 | |------|----------| | 1. 安装的是精简版 OpenSSL 开发包 | 重新安装完整版 `libssl-dev` 或 `openssl-devel` | | 2. 使用了 LibreSSL 而非 OpenSSL | LibreSSL 某些版本移除了该宏(尽管行为兼容) | | 3. 头文件损坏或版本过旧 | 更新系统或重新安装 OpenSSL | #### 如何区分是 OpenSSL 还是 LibreSSL? ```bash openssl version ``` - 如果输出包含 `LibreSSL`(如 `LibreSSL 3.3.6`)→ 是 LibreSSL - 如果输出包含 `OpenSSL 1.1.1` 或 `3.0.x` → 是标准 OpenSSL > ⚠️ LibreSSL 中虽然 `SHA1()` 函数可用,但 **`SHA_DIGEST_LENGTH` 宏可能未定义**! --- ### ✅ 情况三:使用 LibreSSL 导致宏未定义(常见于 Alpine Linux) Alpine Linux 默认使用 **LibreSSL**,其 API 大部分兼容 OpenSSL,但有些宏(如 `SHA_DIGEST_LENGTH`)**并未定义**,即使功能存在。 #### 解决方案: 手动补上宏定义(推荐放在 `.h` 文件或源文件顶部): ```c #include <openssl/sha.h> // 兼容 LibreSSL:补充缺失的宏 #ifndef SHA_DIGEST_LENGTH #define SHA_DIGEST_LENGTH 20 #endif ``` 这样无论是在 OpenSSL 还是 LibreSSL 环境下都能编译通过。 --- ### ✅ 情况四:头文件路径混乱(多版本冲突) 例如你自行编译安装了一个 OpenSSL 到 `/usr/local/ssl`,但系统默认用的是 `/usr/lib/...`,导致头文件和库不匹配。 #### 检查方法: ```bash # 查看编译时包含路径 echo | gcc -E -v - ``` 查看是否优先加载了错误的头文件。 #### 解决方法: 显式指定正确的头文件路径: ```bash gcc your_file.c -o output \ -I/usr/include/openssl \ -lssl -lcrypto ``` 或者如果你用了自定义 OpenSSL: ```bash gcc your_file.c -o output \ -I/usr/local/ssl/include \ -L/usr/local/ssl/lib \ -lssl -lcrypto ``` --- ## ✅ 总结:你现在应该怎么做? 1. ✅ 运行: ```bash grep "define.*SHA_DIGEST_LENGTH" /usr/include/openssl/sha.h ``` - ✔️ 如果有输出 → 确保你的代码包含 `#include <openssl/sha.h>` - ❌ 如果无输出 → 很可能是 LibreSSL 或头文件不完整 2. ✅ 在代码中添加保护性宏定义: ```c #include <openssl/sha.h> #ifndef SHA_DIGEST_LENGTH #define SHA_DIGEST_LENGTH 20 #endif ``` 3.编译时使用正确顺序: ```bash gcc file.c -o file -lssl -lcrypto ``` 4. ✅ 推荐使用 `pkg-config` 自动管理依赖: ```bash gcc $(pkg-config --cflags openssl) file.c $(pkg-config --libs openssl) -o file ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

io_py

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值