在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/server/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)
答案 0 :(得分:0)
我弄清楚问题是什么。我没有意识到nm
命令的输出显示了本地(与外部可见)符号。来自nm
的手册页:
符号类型。至少使用以下类型;其他也是,取决于目标文件格式。如果是小写,则符号通常是本地的;如果是大写,则符号为全局(外部)。
从属库中的符号是本地由小写字母' t'表示。