java:符号查找错误:未定义符号:_ZN2cv6String8allocateEm

时间:2016-05-02 14:15:49

标签: java linker java-native-interface opencv3.0

当我输入

java -Djava.library.path="path to opencv lib folder" : "path to my libJavaFileName.so" JavaFileName

我收到以下消息:

java: symbol lookup error: "path to my libJavaFileName.so": undefined symbol: _ZN2cv6String8allocateEm

undefined symbol: _ZN2cv6String8allocateEm的含义是什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

我怀疑您的Java JNI绑定与您的opencv版本之间存在版本不匹配。

未定义的符号:_ZN2cv6String8allocateEm之所以出现是因为你的libJavaFileName.so包含对该符号的引用,但链接器找不到任何定义它的目标文件。

您可以使用程序c ++ filt将符号解压缩为可读名称:

> c++filt -n _ZN2cv6String8allocateEm
cv::String::allocate(unsigned long)

如果你查看o​​pencv 3.1的源代码,可以看到这个函数确实存在(它在核心模块的stl.cpp中)。

我的机器上的opencv库(版本2.4.8)中没有定义符号,但如果我从源代码构建版本3.1,则在libopencv_core.so中定义。

因此,我猜测你可能需要安装更新版本的opencv。

还值得检查它实际上是否正在加载您认为它的共享库的版本。如果你这样做:

strace -o log.txt java rest_of_your_command_line

然后,您可以查看log.txt以查看正在打开的共享库。尝试使用opencv这个文件来查看是否正在加载正确的版本。

答案 1 :(得分:0)

您的图书馆使用符号cv::String::allocate( unsigned long )

您需要加载提供本机代码所依赖的符号的正确共享对象。执行此操作的最佳方法是使用正确的-L library_name选项编译本机共享对象,使其具有对这些对象的动态依赖关系。