jnetpcap.so: libpcap.so.0.8: 无法打开共享对象文件: 没有那个文件或目录,解决办法

在CentOS 7上编译包含jnetpcap的项目时,遇到libpcap版本不兼容的问题。通过下载特定版本的jnetpcap包,解压并将.so文件复制到JDK目录,以及创建libpcap.so.0.8软链接或添加到ld.so.conf来解决找不到共享对象文件的错误。

jnetpcap在windows下和linux下需要不同的包(如共享库,在windows下是.dll,在linux下是.so文件案),所以跨平台编译会遇见问题,感觉主要的问题还是libpcap的版本问题(在ubuntu下编译直接解决问题1问题2就结束了,centos上libpcap版本不兼容,只好强行修改)

在centos 7下编译含jnetpcap包的文件(libpcap已经安装完毕)
问题1: 出现错误:

java.lang.UnsatisfiedLinkError: no jnetpcap in java.library.path
用下面的链接下载:jnetpcap-1.3.0-1.ubuntu.x86_64.tgz
https://sourceforge.net/projects/jnetpcap/files/jnetpcap/1.3/jnetpcap-1.3.0-1.ubuntu.x86_64.tgz/download

下载完成后解压并复制到项目的lib文件夹下,后用idea导入依赖(包括jar包)
问题2:出现错误:
jnetpcap com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J
使用idea导入下载的jnetpcap包中的.so文件,并且将该文件复制到jdk/jre/lib/amd64(自己的jdk目录中)
问题3:出现错误:
re/lib/amd64/libjnetpcap.so: libpcap.so.0.8: 无法打开共享对象文件: 没有那个文件或目录

找到libpcap.so文件:
使用命令查看安装版本$ rpm -qa | grep libpcap

libpcap-1.5.3-11.el7.x86_64

找出该版本的对应文件$ rpm -ql libpcap-1.5.3-11.el7.x86_64

/usr/lib64/libpcap.so.1
/usr/lib64/libpcap.so.1.5.3
/usr/share/doc/libpcap-1.5.3

/usr/share/doc/libpcap-1.5.3/CHANGES
/usr/share/doc/libpcap-1.5.3/CREDITS
/usr/share/doc/libpcap-1.5.3/LICENSE
/usr/share/doc/libpcap-1.5.3/README
/usr/share/man/man7/pcap-filter.7.gz
/usr/share/man/man7/pcap-linktype.7.gz
/usr/share/man/man7/pcap-tstamp.7.gz
发现只有libpcap.so.1,没有libpcap.so.0.8,将libpcap.so.1复制备份一份,并修改名字为libpcap.so.0.8

再次运行,可以使用

若还是存在无法找到文件的问题

将libpcap.so.1所在目录添加到文件/etc/ld.so.conf中,

打开ld.so.conf文件,然后将libpcap.so目录添加进去

includeld.so.conf.d/*.conf   #原来的内容
# 自己的目录
/usr/lib64
/usr/local/lib

然后保存,再终端下执行 ldconfig

参考网址:
https://blog.csdn.net/weixin_35757704/article/details/78625091

打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/2n04r Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(CC++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在者版本不匹配等。在本案例中,我们将会探讨如何解决这个问题,并参考提供的博客链接进行深入分析。我们需要了解Java本地接口(JNI,Java Native Interface)是如何工作的。JNI允许Java代码调用本地方法,这些方法是由非Java语言编写的,例如CC++。当Java虚拟机(JVM)尝试加载一个本地方法并找不到对应的库时,就会抛出`UnsatisfiedLinkError`。解决此问题的第一步是检查库文件的路径。在Java中,我们可以通过`System.loadLibrary("libraryName")`来加载本地库。这里的"libraryName"是库文件的名称(不包含后缀),例如在LinuxMac系统上通常是`liblibraryName.so`,在Windows系统上则是`libraryName.dll`。确保库文件位于JVM的搜索路径下,这个路径可以通过环境变量`LD_LIBRARY_PATH`(Linux/Mac)`PATH`(Windows)来设置。如果库文件位置没有问题,那么可能是库文件版本与正在运行的Java代码不兼容。检查Java项目中的`native`库版本,确保它与你的系统和Java版本相匹配。有时,升级降级库版本可以解决问题。在提供的`build-local.mk_setpath`文件中,可能包含了构建过程中的路径设置。这通常是在编译和链接本地库时使用的Makefile,用于指定编译器选项、库路径等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值