Java ‹-› C ‹-› Фортран

У меня небольшая проблема. Я пытаюсь скомпилировать программу Java, взаимодействующую с программой C, которая затем взаимодействует с программой FORTRAN 77. По сути, Java через JNI, используя программу C, которая использует LAPACK (версия FORTRAN)

Программа на C работает сама по себе, взаимодействуя с программой FORTRAN 77 должным образом, но когда я запускаю тестовую программу на Java, связь между Fortran и C нарушается.

Я компилирую программу на C так:

gcc -c -fPIC -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux -llapack -lblas -lm Optibox.c
gcc -shared -o libOptibox.so Optibox.o
LD_LIBRARY_PATH=./:${LD_LIBRARY_PATH} java Optibox

Возвращает ошибку:

java: symbol lookup error: /home/christian/workspace/testJNI4/libOptibox.so: undefined symbol: dsytrf_

Что вступает в игру из-за этого фрагмента кода:

static long dsytrf(char UPLO, long N, double* A, long LDA, long* IPIV, double* WORK, long LWORK)
{
    extern void dsytrf_(char* UPLOp, long* Np, double* A, long* LDAp, long* IPIV, double* WORK, long* LWORKp, long* infop);
    long info;
    dsytrf_(&UPLO, &N, A, &LDA, IPIV, WORK, &LWORK, &info);
    return info;
}

Эта функция отлично работает, если я просто создаю программу на языке C, проверяющую функцию, но при использовании Java LAPACK больше не связывается.

Итак, я предполагаю, что возникает вопрос: как мне сделать правильную ссылку на компилятор Java в этом случае?

РЕДАКТИРОВАТЬ: Я нашел решение, по крайней мере, на данный момент. Я изменил оператор компоновщика, чтобы он также ссылался на сами библиотеки BLAS, LAPACK и MATRIX. Кажется, это полностью решает проблему, но я не уверен в ее элегантности. Я попробую предложенный Idav1s путь к библиотеке.

gcc -shared -o libOptibox.so Optibox.o liblapack.so libblas.so libm.so

Это требовало, чтобы я нашел библиотеки в / usr / lib и скопировал их в свой каталог компиляции, но, по крайней мере, это работает!


person Ishayu    schedule 23.05.2012    source источник
comment
Где компоненты Java и Fortran? Единственный модуль, показанный в сборке, - это тот, который компилирует Optibox.c в libOptibox.so.   -  person wallyk    schedule 23.05.2012
comment
Java <-> C <-> Fortran? Ага! Я бы не хотел быть на твоем месте   -  person slezica    schedule 23.05.2012
comment
Да, это заставляет вас перевернуться с ног на голову. Что, как я подозреваю, в вашем случае было бы действительно полезно, чтобы вы могли снова встать на правильный путь. :) А если серьезно, будет еще хуже. Мы также добавляем MATLAB поверх него. MATLAB ‹-› Java ‹-› C ‹-› FORTRAN, а также через файлы MEX MATLAB ‹-› C ‹-› FORTRAN. Веселые времена!   -  person Ishayu    schedule 23.05.2012
comment
liblapack - это что? Фортран или Java? Может и то, и другое? В любом случае, где это dsytrf_ реализовано?   -  person wallyk    schedule 23.05.2012
comment
LAPACK запрограммирован на FORTRAN 77. dsytrf_ является частью LAPACK, он разлагает матрицу на более низкую и диагональную матрицу, которая должна быть решена с помощью dsytrs_ с использованием LDL ** T.   -  person Ishayu    schedule 23.05.2012


Ответы (2)


Это действительно относится к комментарию, а не к ответу, но я не могу найти кнопку комментария! В любом случае, это из страницы руководства gcc, re: флаг «-shared»: «Создать общий объект, который затем может быть связан .... Для предсказуемых результатов вы также должны указать тот же набор параметров, который использовался для генерировать код (-fpic, -fPIC или подопции модели), когда вы указываете этот параметр ».

В вашем операторе ссылки gcc нет "-fPIC". Вот с чего я бы начал. (На самом деле, где я бы действительно начал, это прыгать на стол тех, кто хочет, чтобы вы написали этот ужасный код, и кричать на них, пока они не передумают.)

person bob.sacamento    schedule 23.05.2012
comment
Хорошо подмечено. Я постараюсь добавить и это. Однако передумать не будет. К сожалению, это абсолютно необходимо. Даже я понимаю почему. : | - person Ishayu; 24.05.2012
comment
Из-за того, что это указано в документации, это, вероятно, не повредит, но я могу вам сказать, что это тоже не решает проблему. - person Ishayu; 25.05.2012

Вам нужно добавить свои LAPACK и blas libs в java.library.path:

java -Djava.library.path=/usr/lib/lapack:<other paths> Optibox

Иногда недостаточно добавить их в LD_LIBRARY_PATH.

РЕДАКТИРОВАТЬ: ваша ссылка также неверна. Должен быть:

gcc -shared -fPIC -o libOptibox.so Optibox.o -llapack -lblas -lm

Флаги компоновщика не имеют значения при сборке Optibox.o. libOptibox.so lib нужны другие библиотеки. В противном случае он никогда не найдет их во время загрузки.

person ldav1s    schedule 23.05.2012
comment
Я попробую это чуть позже. Спасибо за ответ! Однако я нашел решение. Я скоро добавлю свой ответ. - person Ishayu; 24.05.2012