Это, наверное, похоже на кошмар, но я бы очень хотел, чтобы это работало. Я использую этот пример по большей части: Вызов C из Haskell, и я пытаюсь заставить это работать на ubuntu.
Я запускаю это в java:
package test;
public class JniTest {
public native int fib(int x);
}
this в c после создания файла .h с помощью javah: (test_JniTest.c)
#include "test_JniTest.h"
#include "Safe_stub.h"
JNIEXPORT jint JNICALL Java_test_JniTest_fib(JNIEnv * e, jobject o, jint f)
{
return fibonacci_hs(f);
}
а затем для ссылки в haskell (перед заглушкой): (Safe.hs)
module Safe where
import Foreign.C.Types
fibonacci :: Int -> Int
fibonacci n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral
foreign export ccall fibonacci_hs :: CInt -> CInt
и это то, что я пытаюсь скомпилировать с помощью:
ghc -c -O Safe.hs
а затем:
ghc -shared -o libTest.jnilib -optc-O test_JniTest.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux
и я получаю эту ошибку:
/usr/bin/ld: test_JniTest.o: перемещение R_X86_64_PC32 против undefined символ `fibonacci_hs 'не может использоваться при создании общего объект; перекомпилировать с -fPIC/usr/bin/ld: окончательная ссылка не удалась: Плохая стоимость collect2: ld возвращен 1 статус выхода
Я не эксперт по какому-либо средству и не знаю, что с этим делать. Я пытался скомпилировать различные способы с помощью -fPIC, но я продолжал получать ту же ошибку. Любая идея, что я могу делать неправильно?
Спасибо!