java:符号查找错误:未定义的符号:ZN2cv6String8allocateEm

java:符号查找错误:未定义的符号:ZN2cv6String8allocateEm,java,linker,java-native-interface,opencv3.0,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 未定义符号的含义是什么?\u ZN2cv6String8a

我打字的时候

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

未定义符号的含义是什么?\u ZN2cv6String8allocateEm
我如何修复它?

您的库使用符号
cv::String::allocate(无符号长)


您需要加载适当的共享对象,这些对象提供本机代码所依赖的符号。最好的方法是使用适当的
-L library\u name
选项编译本机共享对象,使其对这些对象具有动态依赖关系。

我怀疑Java JNI绑定和opencv版本之间存在版本不匹配

未定义的符号:ZN2cv6String8allocateEm出现,因为libJavaFileName.so包含对该符号的引用,但链接器找不到任何定义该符号的对象文件

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

> c++filt -n _ZN2cv6String8allocateEm
cv::String::allocate(unsigned long)
如果查看opencv 3.1的源代码,您会发现该函数确实存在(它位于核心模块的stl.cpp中)

该符号未在我的计算机上的opencv库(版本2.4.8)中定义,但在libopencv_core中定义。因此,如果我从源代码构建版本3.1

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

还需要检查它是否实际加载了您认为是的共享库的版本。如果您这样做:

strace -o log.txt java rest_of_your_command_line

然后,您可以通过log.txt查看正在打开哪些共享库。请尝试为opencv刷新此文件,以查看是否加载了正确的版本。

谢谢您的回复,但我有最新版本的opencv 3.1。好的。我想知道你是否安装了两个版本,但没有找到新版本?我在上面添加了一个关于检查正在加载哪个共享库的注释