Возможно, это звучит как кошмар, но мне бы очень хотелось, чтобы это сработало. Я использую этот пример по большей части: Вызов 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, но продолжал получать ту же ошибку.Есть идеи, что я делаю не так?
Спасибо!