报错出现libcrypto.so.10 no found, libssl.so.10 no found ,.so库文件缺失问题


注:以下方法同样适用于 libssl.so.10: cannot open shared object file: No such file or directory

libssl.so.4: cannot open shared object file: No such file or directory等问题


库文件缺失问题

在打开数科阅读器时提示不能打开libcrypto.so.10库文件,或者linux软件操作使用过程中,经常出现其他libcrypto.so.10 no found 、 libssl.so.10 no found 、libssl.so.4 no found 等报错。

如下图提示 libcrypto.so.10出错,不能打开该共享库文件
在这里插入图片描述

问题描述:

运行一个程序,提示libcrypto.so.10共享库文件未找到。
error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory

原因分析:

软件包安装目录不包含该库,且/usr/lib/下也没有该共享库,导致软件启动不起来。

解决方法:

1.在网上或其他电脑找到libcrypto.so.10包并导入到本机/usr/lib/下

2.sudo find / -name "libcrypto.so.10" 查找本机其他位置是否有该文件,如:找到/opt/下有一个libcrypto.so.10文件,两种操作,直接复制或者创建软链接

  • 方法(1).将libcrypto.so.10复制到/usr/lib下(#或打不开的软件安装目录下) sudo cp /opt/libcrypto.so.10 /usr/lib/libcrypto.so.10

  • 方法(2).创建软链接 ln -s /opt/libcrypto.so.10 /usr/lib/libcrypto.so.10

3.sudo apt install 或yum install 安装同名软件包libcrypto(#不一定有)

### 关于正确使用 `System.getProperty('user.dir')` 和加载 `libcrypto.so.1.1` 在 Java 中,可以通过 `System.getProperty('user.dir')` 获取当前工作目录。此方法返回的是 JVM 启动时的工作目录路径,通常用于动态定位资源文件或库文件的位置。 为了正确加载像 `libcrypto.so.1.1` 这样的本地库文件,可以按照以下方式操作: #### 动态设置 `java.library.path` Java 使用 `-Djava.library.path` 参数指定本地库的搜索路径。然而,在程序运行过程中无法直接更改该参数。因此,需要通过手动调用 `System.load()` 或者调整环境变量的方式显式加载库文件。 以下是实现的具体方法: 1. **获取当前工作目录** 可以利用 `System.getProperty('user.dir')` 来获取当前工作目录,并将其作为基础路径拼接目标 `.so` 文件的实际位置[^1]。 2. **加载库文件** 调用 `System.load(path)` 方法显式加载特定路径下的共享库文件。例如: ```java String currentDir = System.getProperty("user.dir"); String libPath = currentDir + "/lib/libcrypto.so.1.1"; // 假设 .so 文件位于 ./lib 下 try { System.load(libPath); } catch (UnsatisfiedLinkError e) { System.err.println("Failed to load library: " + e.getMessage()); } ``` 3. **验证库是否成功加载** 如果库依赖其他子模块(如 `libssl.so.1.1`),则需确保这些依赖项也存在于同一路径下或者已配置至系统的 `LD_LIBRARY_PATH` 环境变量中[^1]。 4. **处理潜在错误** 当遇到 `UnsatisfiedLinkError` 错误时,可能是因为缺少必要的依赖关系或其他兼容性问题。此时可通过调试工具(如 `ldd`)检查具体缺失哪些依赖项并补充完整。 --- ### 示例代码片段 以下是一个完整的例子展示如何结合 `System.getProperty('user.dir')` 加载 `libcrypto.so.1.1` 并捕获异常情况: ```java public class LibraryLoader { public static void main(String[] args) { String currentDir = System.getProperty("user.dir"); // 获取当前工作目录 String libCryptoPath = currentDir + "/lib/libcrypto.so.1.1"; try { System.out.println("Attempting to load library from path: " + libCryptoPath); System.load(libCryptoPath); // 显式加载库文件 System.out.println("Library loaded successfully."); // 测试功能逻辑... } catch (UnsatisfiedLinkError e) { System.err.println("Failed to load native library: " + e.getMessage()); handleMissingDependencies(e); } } private static void handleMissingDependencies(UnsatisfiedLinkError error) { System.err.println("Possible missing dependencies detected:"); // 执行 ldd 检查依赖链路 ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "ldd /path/to/libcrypto.so.1.1"); processBuilder.redirectErrorStream(true); try { Process process = processBuilder.start(); java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { if (line.contains("not found")) { System.err.println(line); } } } catch (Exception ex) { System.err.println("Error during dependency check: " + ex.getMessage()); } } } ``` --- ### 注意事项 - 若项目涉及多个平台支持,则应考虑不同操作系统间的差异(Windows 的 DLL、macOS 的 dylib)。可以在编译阶段生成对应的目标二进制文件。 - 对于 Android 用户版 ADB 需要降权的情况,虽然与本主题无直接关联,但值得注意的是某些安全策略可能会阻止访问敏感 API[^2]。 - 在实际部署场景中推荐将所有相关联的 SO 文件放置在同一目录结构内以便统一管理[^1]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值