Я пытаюсь использовать общую библиотеку C ++, которую я создал (libmine.so
) и использует библиотеку Intel MKL из Java с использованием JNI.
Я также создал libminejni.so
и загрузил ее из кода Javaнапример:
System.loadLibrary("minejni")
Однако не удалось загрузить одну из библиотек MKL (libmkl_avx2.so
)
<path_to_lib>/libmkl_avx2.so: <path_to_lib>/libmkl_avx2.so:
undefined symbol: mkl_sparse_optimize_bsr_trsm_i8
Символ определен в libmkl_gnu_thread.so
>nm <path_to_lib>/libmkl_gnu_thread.so | grep mkl_sparse_optimize_bsr_trsm_i8
00000000004fe240 T mkl_sparse_optimize_bsr_trsm_i8
Итак, я загрузил библиотеку, используя System.loadLibrary
перед загрузкой проблемной библиотеки, но ошибка не была устранена.
Я выполнил ее с LD_DEBUG=bindings,symbols
и обнаружил, что она не выполняет поиск libmkl_gnu_thread.so
для символа.
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/local/workspaces/JDK8-1.0/runtime/jdk1.8/bin/java [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libpthread.so.0 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib/amd64/jli/libjli.so [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libdl.so.2 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libc.so.6 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/jdk1.8/jre/lib/amd64/server/libjvm.so [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libm.so.6 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib/libmkl_avx2.so [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libdl.so.2 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/libc.so.6 [0]
[java] 11275: symbol=mkl_sparse_optimize_bsr_trsm_i8; lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
[java] 11275: /lib/libmkl_avx2.so: error: symbol lookup error: undefined symbol: mkl_sparse_optimize_bsr_trsm_i8 (fatal)
Библиотека работает, если я создаю исполняемый файл с использованием C ++.Я хотел добавить libmkl_gnu_thread.so
в список библиотек, в которых ld будет искать символы, кто-нибудь знает, как это сделать?
ПРИМЕЧАНИЕ. Если я добавлю все библиотеки, относящиеся к MKL, в LD_PRELOAD, это будет работать, но яищу менее хакерский путь.ПРИМЕЧАНИЕ 2. Некоторые пути в примере изменены, чтобы удалить личную информацию.