Java中System.loadLibrary加载Tesseract库失效但System.load可正常使用的问题排查
问题根源
System.loadLibrary()的查找逻辑和系统常规动态库查找规则完全独立,有严格的固定拼接规则:
- 调用时传入的参数是逻辑库名,而非实际文件名
- Linux环境下,它会自动给传入的逻辑库名拼接固定前缀
lib和固定后缀.so,生成最终要查找的文件名 - 仅在
java.library.path指定的目录中查找拼接完成后的文件,不会识别带版本号的动态库,也不会自动匹配版本软链接
各加载方式失效的具体原因
在CentOS7通过yum安装tesseract后,系统实际生成的动态库相关文件为:
- 真实库文件:
libtesseract.so.3.0.4 - 自动生成的主版本软链接:
libtesseract.so.3
不存在符合System.loadLibrary()查找要求的libtesseract.so文件,因此所有调用全部报错: - 传入
tesseract时,查找目标为libtesseract.so,该文件不存在 - 传入
libtesseract时,会被自动拼接为liblibtesseract.so,无对应文件 - 传入带后缀的文件名(如
libtesseract.so、libtesseract.so.3.0.4)时,仍会自动拼接前缀,最终查找的是liblibtesseract.so.so、liblibtesseract.so.3.0.4.so这类不存在的文件
解决方案
- 手动创建软链接是符合规则的解决方式,执行命令:
sudo ln -s /lib64/libtesseract.so.3 /usr/lib64/libtesseract.so - 无需手动操作的方案:直接安装tesseract开发包,执行命令:
sudo yum install tesseract-devel,该包会自动创建符合Java加载要求的libtesseract.so软链接
内容的提问来源于stack exchange,提问作者user3618000
相关产品推荐
相关产品推荐

