Sto provando a compilare del codice Rust con un codice Haskell. Ho un sistema di test configurato con un file, Fibonacci.hs
con una funzione che calcola i numeri di Fibonacci in Haskell ed esporta la funzione come fibonacci_hs
tramite l'FFI di Haskell (come qui: https://github.com/nh2/haskell-from-python, anche se copierò e incollerò in basso), e in wrapper.c
hanno definito le funzioni da esportare da chiamare per l'inizializzazione e l'uscita da RTS di Haskell.Chiamare il codice Haskell collegato dinamicamente da Rust
Il codice simile a questo:
{- 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();
}
posso compilare questi tramite:
ghc -c -dynamic -fPIC Fibonacci.hs
ghc -c -dynamic -fPIC wrapper.c
ed io collegare gli oggetti in una libreria condivisa/dinamico (più su questo in un secondo) tramite:
ghc -o libfibonacci.so -shared -dynamic -fPIC Fibonacci.o wrapper.o -lHSrts
Sulla esecuzione del codice di esempio Python dal repository collegato, funziona bene sul mio Mac, ma non posso ottenere il collegamento con Rust.
A Rust mio codice sembra qualcosa di simile:
//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();
}
}
E posso compilare con rustc main.rs -L .
(dal file della libreria condivisa è locale).
L'errore genero su Mac, quando viene compilato con una libreria dinamica (ghc -o libfibonacci.so -shared -static haskell/Fibonacci.o haskell/wrapper.o -lHSrts
poi 'rustc main.rs -L.) È in fase di esecuzione:
dyld: Symbol not found: _ffi_call
Referenced from: ./libfibonacci.so
Expected in: flat namespace
in ./libfibonacci.so
Trace/BPT trap: 5
Grazie per qualsiasi aiuto in anticipo.
Mi dispiace. @Shepmaster --typo da parte mia, dovrebbe essere .c. – chalkandpaste
@ReidBarton Ho tagliato tutte le cose estranee. Concentrandosi sulla compilazione di una libreria dinamica sul mio Mac usando Rust e Haskell. – chalkandpaste