gpt4 book ai didi

Java JNI “symbol lookup error” 当依赖共享库包含符号

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:33 27 4
gpt4 key购买 nike

在 Ubuntu 16.04 上,我针对另一个共享库构建了一个 JNI 库。依赖项是 OpenCv,版本 3.4.0,在本地构建,未安装在标准库路径中。

我正在使用 maven 中的 cmake 来构建我的 JNI 库。编译和链接行的输出如下:

[ 66%] Building CXX object CMakeFiles/lib-image-native.jiminger.com.dir/sources/CvRasterNative.cpp.o /usr/bin/c++ -DUNIX -Dlib_image_native_jiminger_com_EXPORTS -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux -I/home/jim/src/opencv-packaging/package-native/target/cmake -I/home/jim/utils/opencv-3.4.0/installed/include -fPIC -std=gnu++11 -o CMakeFiles/lib-image-native.jiminger.com.dir/sources/CvRasterNative.cpp.o -c /home/jim/src/opencv-packaging/package-native/target/sources/sources/CvRasterNative.cpp [100%] Linking CXX shared module liblib-image-native.jiminger.com.so /home/jim/src/opencv-packaging/package-native/target/dependency/cmake/bin/cmake -E cmake_link_script CMakeFiles/lib-image-native.jiminger.com.dir/link.txt --verbose=1 /usr/bin/c++ -fPIC -shared -o liblib-image-native.jiminger.com.so CMakeFiles/lib-image-native.jiminger.com.dir/sources/CvRasterNative.cpp.o -Wl,-rpath,/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/libjawt.so /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so

当我运行调用我的 native 函数的测试时,我得到:

.../java: symbol lookup error: [path to my library].so: undefined symbol: _ZN2cv6String8allocateEm

在我的 Java 代码中,我显式加载了这个库(使用 System.load)以及相关的 OpenCv 库。该符号位于 OpenCv 库中,我明确地使用 System.load'ing。

nm [path to opencv shared library].so | grep _ZN2cv6String8allocateEm

给予

0000000000442990 t _ZN2cv6String8allocateEm

当我调用我的图书馆时,我得到了那个错误。它说符号未定义。但它的定义在我明确加载的另一个库中(注意,它在“文本”段中)。

有人可以告诉我我缺少什么吗?

谢谢

编辑:如果有所不同,当我 ldd 我的共享库时,我会得到

linux-vdso.so.1 =>  (0x00007ffe6e58f000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7d279dc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7d277c5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7d273fb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7d270f2000)
/lib64/ld-linux-x86-64.so.2 (0x00005574eb402000)

最佳答案

我想出了问题所在。我没有意识到 nm 命令的输出显示本地(与外部可见)符号。来自 nm 的手册页:

The symbol type. At least the following types are used; others are, as well, depending on the object file format. If lowercase, the symbol is usually local; if uppercase, the symbol is global (external).

依赖库中的符号是局部的,用小写的't'表示。

关于Java JNI “symbol lookup error” 当依赖共享库包含符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com