无法在Linux上加载OpenCV-未定义的符号错误

时间:2018-11-29 19:06:27

标签: java linux opencv debian

所以我想玩一点OpenCV。我的测试项目是使用Java(操作系统是Debian Linux 8.4),并且已经按照本教程构建OpenCV:https://opencv-java-tutorials.readthedocs.io/en/latest/01-installing-opencv-for-java.html

修复了几个问题后,我能够成功构建OpenCV jar和so文件。在构建过程中没有错误或警告。我已经将 opencv-400.jar libopencv_java400.so 放入了项目的 lib 子文件夹中。添加了jar文件以在Eclipse中构建路径,并在Eclipse的Build Configurations中将正确的路径放置到该文件中。

我的项目只有一个Main类,这是我在OpenCV的源代码中找到的示例,所以没有什么复杂的事情:

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

public class Main {

    public static void main(String[] args) {
        System.out.println("Welcome to OpenCV " + Core.VERSION);
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println("m = " + m.dump());
    }
}

看起来一切正常,但是当我运行项目时,我看到了这个异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: undefined symbol: _ZNK6google8protobuf8internal12MapFieldBase28SpaceUsedExcludingSelfNoLockEv
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Main.main(Main.java:9)

这部分例外确实让我担心:

/home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: undefined symbol: _ZNK6google8protobuf8internal12MapFieldBase28SpaceUsedExcludingSelfNoLockEv

在我看来,该 libopencv_java400.so 文件有问题。我对吗?还是我需要其他文件才能使其正常工作?我已经将OpenCV构建为Debug,因此该文件具有135 MiB,但是我认为这应该不是问题。

我将感谢您的任何想法!

1 个答案:

答案 0 :(得分:1)

该错误表示您的系统没有安装合适的protobuf库。您可以尝试sudo apt install libprotobuf10,尽管我不能保证会有所帮助。

或者,您也可以运行ldd /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so,这将向您显示OpenCV尝试导入的所有库-也许Protobuf实际上是与OpenCV一起构建的,但尚未安装。