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