Ошибка JCuda: неопределенный символ: Pointer_buffer

#java #cuda #java-native-interface

#java #cuda #java-native-interface

Вопрос:

Я пытаюсь запустить пример JCuda в Debian Linux (32 бит). Поскольку на веб-сайте JCuda для Linux x86 нет доступных двоичных файлов, я дополнил библиотеки. Теперь я пытаюсь запустить пример deviceQuery, но получаю следующие ошибки:

Ошибка при загрузке собственной библиотеки "JCudaDriver-linux-x86" с базовым именем "JCudaDriver"
Название операционной системы: Linux
Архитектура: i386
Размер бита архитектуры: 32
Трассировка стека при попытке загрузить библиотеку в качестве ресурса:
java.lang.Исключение NullPointerException: не найден ресурс с именем '/lib/libJCudaDriver-linux-x86.so'
 в jcuda.LibUtils.loadLibraryResource(LibUtils.java:144)
 в jcuda.LibUtils.LoadLibrary(LibUtils.java:80)
в jcuda.driver.JCudaDriver.(JCudaDriver.java:192)
 в jcudatest.JCudaTest.main(JCudaTest.java:29)
Трассировка стека при попытке загрузить библиотеку в виде файла:
java.lang.Ошибка неудовлетворительной ссылки: /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/библиотека / libjcudadriverjni-linux-x86.so: /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/библиотека/libJCudaDriver-linux-x86.so:неопределенный символ: Pointer_buffer
в java.lang.Загрузчик классов $NativeLibrary.load(собственный метод)
в java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807)
 в java.lang.ClassLoader.LoadLibrary(ClassLoader.java:1732)
 в java.lang.Runtime.loadLibrary0(Runtime.java:823)
 в java.lang.System.LoadLibrary(System.java: 1028)
 в jcuda.LibUtils.LoadLibrary(LibUtils.java:90)
в jcuda.driver.JCudaDriver.(JCudaDriver.java:192)
 в jcudatest.JCudaTest.main(JCudaTest.java:29)

Исключение в потоке "main" java.lang.Ошибка UnsatisfiedLinkError: не удалось загрузить собственную библиотеку
в jcuda.LibUtils.LoadLibrary(LibUtils.java:122)
 в jcuda.driver.JCudaDriver.(JCudaDriver.java:192)
 в jcudatest.JCudaTest.main(JCudaTest.java:29)
Результат Java: 1

Я полагаю, что ошибка здесь связана с этим неопределенным символом Pointer_buffer, поскольку я создал символические ссылки в /lib, и эта папка находится в переменных ПУТИ (я вижу, что она разрешает символическую ссылку на /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/lib/libJCudaDriver-linux-x86.so как и предполагалось).
Все работает и с Cuda, поскольку я могу компилировать и запускать примеры Cuda. Версия Cuda — 4.0.17 и JCuda 0.4.0-beta1 (на веб-сайте JCuda я вижу версию 0.4.0-beta1. Эти библиотеки были скомпилированы для CUDA 4.0 (сборка 17), поэтому я думаю, что здесь у меня тоже нет никакой несовместимости).
Я настраиваю свой проект на Netbeans и включил исходные файлы, присутствующие в папке JcudaJava. Нужно ли мне включать файлы cpp и hpp из папок JCudaDriverJNI и JCudaRuntimeJNI (я никогда раньше не работал с JNI, на самом деле не знаю, что мне нужно включить).

Заранее спасибо,
Rui

Ответ №1:

«Неопределенный символ» означает, что определение символа (переменной, функции) не найдено. JCuda определяет Pointer_buffer в CommonJNI/PointerUtils.cpp так что, должно быть, была какая-то проблема, включая PointerUtils.o в файле .so. Были ли какие-либо ошибки при компиляции?