Вызов Haskell из Java с промежуточным C

Возможно, это звучит как кошмар, но мне бы очень хотелось, чтобы это сработало. Я использую этот пример по большей части: Вызов C из Haskell , и я пытаюсь заставить это работать в ubuntu.

Я запускаю это в java:

package test;

public class JniTest {
    public native int fib(int x);
}

это в 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 против неопределенного символа `fibonacci_hs 'не может использоваться при создании общего объекта ; перекомпилировать с помощью -fPIC / usr / bin / ld: последняя ссылка не удалась: неверное значение collect2: ld вернул 1 статус выхода

Я ни в коем случае не эксперт по c и не знаю, что с этим делать. Я пробовал компилировать разными способами с -fPIC, но продолжал получать ту же ошибку.Есть идеи, что я делаю не так?

Спасибо!

19
задан Charles Durham 1 November 2011 в 19:36
поделиться