在Ubuntu 16.04上,我正在构建一个针对另一个共享库的JNI库。依赖项是OpenCv,版本3.4.0,在本地构建,不安装在标准库路径中。
我正在使用maven的cmake来构建我的JNI库。编译和链接行的输出如下:
[66%]构建CXX对象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%]链接CXX共享模块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 /服务器/ libjvm.so
当我运行调用我的本机函数的测试时,我得到:
.../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
当我打电话到我的图书馆时,我得到了那个错误。它说符号是未定义的。但它的定义是在我明确加载的另一个库中(注意,它在'text'段中)。
有人可以告诉我我错过了什么吗?
谢谢
编辑:如果它有所作为,当我找到我的共享库时,我得到了
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
命令的输出显示了本地(vs外部可见)符号。从nm
的手册页:
符号类型。至少使用以下类型;其他也是,取决于目标文件格式。如果是小写,则符号通常是本地的;如果是大写,则符号为全局(外部)。
从属库中的符号由小写字母't'表示。