Próbuję skompilować kod Rust z kodem Haskella. Mam system testowy skonfigurowany z plikiem, Fibonacci.hs
z funkcją, która oblicza numery fibonacciego w Haskell i eksportuje funkcję jako fibonacci_hs
przez Haskella FFI (jak tutaj: https://github.com/nh2/haskell-from-python, chociaż będę kopiować i wklejać na dole), a następnie wrapper.c
zdefiniował funkcje eksportu do wywołania w celu zainicjowania i wyjścia z RTS Haskella.Wywołanie dynamicznie połączonego kodu Haskella z Rust
Kod wygląda następująco:
{- Fibonacci.hs -}
{-# LANGUAGE ForeignFunctionInterface #-}
module Fibonacci 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
// wrapper.c
#include <stdlib.h>
#include "HsFFI.h"
void
example_init (void)
{
hs_init (NULL, NULL);
}
void
example_exit (void)
{
hs_exit();
}
skompilować je poprzez:
ghc -c -dynamic -fPIC Fibonacci.hs
ghc -c -dynamic -fPIC wrapper.c
i I powiązanie obiektów do wspólnej/biblioteki dynamicznej (więcej na ten temat w drugi) poprzez:
ghc -o libfibonacci.so -shared -dynamic -fPIC Fibonacci.o wrapper.o -lHSrts
Na uruchamiając przykładowy kod Pythona z połączonego repozytorium, to działa dobrze na moim Macu, ale mogę Trzeba go połączyć z Rustem.
w Rust mój kod wygląda mniej więcej tak:
//main.rs
#[link(name = "fibonacci")]
extern {
fn fibonacci_hs (n : i32); // c_int = i32
fn fib_init(); // start hs rts
fn fib_exit(); // kill hs rts
}
fn main() {
unsafe {
fib_init();
for i in 0..100 {
println!("{:?}th fibonacci : {:?}", i, fibonacci_hs(i));
}
fib_exit();
}
}
I skompilować z rustc main.rs -L .
(od wspólny plik biblioteki jest lokalny).
Błąd wygenerować na Mac, gdy skompilowany z biblioteki dynamicznej (ghc -o libfibonacci.so -shared -static haskell/Fibonacci.o haskell/wrapper.o -lHSrts
następnie „rustc main.rs -L.) Jest w czasie wykonywania:
dyld: Symbol not found: _ffi_call
Referenced from: ./libfibonacci.so
Expected in: flat namespace
in ./libfibonacci.so
Trace/BPT trap: 5
Dzięki za pomoc z góry.
Przepraszam za to. @Shepmaster --typo z mojej strony, powinno być .c. – chalkandpaste
@ReidBarton Wycinam wszystkie obce rzeczy. Koncentrując się na kompilacji biblioteki dynamicznej na moim macu przy użyciu Rust i Haskell. – chalkandpaste