未定义的符号:_ZTTN2cv4SURFE

undefined symbol: _ZTTN2cv4SURFE

本文关键字:ZTTN2cv4SURFE 符号 未定义      更新时间:2023-10-16

我想使用JNI从java调用C++代码。我已经学习了很多关于这方面的教程,当C++代码"简单"时,所有教程都在工作。但是我要调用的C++代码包含了opencv库并使用了它的各种函数。这就是我遇到问题的地方。。。我正在做的是:

1.)g++-fPIC-共享-I/usr/lib/jvm/java-1.7.0-openjdk-i386/include-I/usr/lib/Jjvm/java-1.7.0-oopenjdk-i86/include/linux-o libHello.so Hello.cpp

从而创建.so文件。

2.)我将创建的.so文件复制到我使用它的目录中,就像我在教程中所做的那样,并加载它:

static {
System.loadLibrary("Hello");
}

但我得到了一个未定义符号的UnSatisfiedLinkError:_ZTTN2cv4SURFE

最有可能的是,在第一步中出现了一个错误,以至于它找不到我的opencv库。但我不知道正确的命令是什么

ldd-d libHello.so生成:

linux-gate.so.1 =>  (0xb777d000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb765e000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7640000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7496000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb746a000)
/lib/ld-linux.so.2 (0xb777e000)

未定义符号:_ZTTN2cv4SURFE(./libHello.so)

未定义符号:_ZTV11CvStatModel(./libHello.so)

未定义符号:_ZTVN2cv24BackgroundSubtractorMOG2E(./libHello.so)

未定义符号:_ZTVN2cv4SURFE(./libHello.so)

未定义符号:_ZTV5CvSVM(./libHello.so)

编辑:

对于其他遇到同样问题的人:

1.)正如一些人提到的,我并没有链接到opencv库。

2.)但这还不够。我使用了这个命令,在一些教程中也有这样的操作:

g++-共享-I/usr/lib/jvm/java-1.7.0-openjdk-i386/include-I/usr/lib/jvm/java-1.0.0-openjdk-i386/ininclude/linux-I/usr/local/include/opencv-L/usr/local/lib-lopencv_nofree-lopencv_features2d-lopencv_core-lopencvc_higgui Hello.cpp-o libHello.so

这导致在进行"ldd"时出现未定义符号错误

我将命令更改为:

g++Hello.cpp-shared-I/usr/lib/jvm/java-1.7.0-openjdk-i386/include-I/usr/libr/jvm/java-1.7.0-oopenjdk-i86/include/linux-I/usr/local/include/opencv-L/usr/local/lib-lopenc_nonfree-lopencv_features2d-lopenv_core-lopen_v_higgui-o libHello.so

也就是说,我只是直接在g++后面写Hello.cpp,而不是在末尾。这就解决了问题。

我不知道为什么这个有效,而前一个无效。但也许有人能告诉我。

您可能需要指定一个到附加库的路径,以便JVM可以加载它们。向Java:添加一个参数

-Djava.library.path=/path/to/opencv/libs:/other/paths/as/needed

这个参数必须在类名之前,这样Java就知道它是JVM的参数,而不是程序的参数。