Tôi đang cố gắng biên dịch một số mã Rust với một số mã Haskell. Tôi có một hệ thống thử nghiệm được thiết lập với một tệp, Fibonacci.hs
với một hàm tính số lượng mã trong Haskell và xuất hàm theo số fibonacci_hs
qua FFI của Haskell (như ở đây: https://github.com/nh2/haskell-from-python, mặc dù tôi sẽ sao chép và dán ở dưới cùng), và wrapper.c
đã xác định các chức năng xuất để được gọi để khởi tạo và thoát khỏi RTS của Haskell.Gọi mã Haskell được liên kết động từ Rust
Mã này trông như thế này:
{- 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();
}
tôi biên soạn những qua:
ghc -c -dynamic -fPIC Fibonacci.hs
ghc -c -dynamic -fPIC wrapper.c
và tôi liên kết các đối tượng vào một chia sẻ thư viện/động (thêm về điều này trong một giây) thông qua:
ghc -o libfibonacci.so -shared -dynamic -fPIC Fibonacci.o wrapper.o -lHSrts
On chạy mã ví dụ Python từ kho lưu trữ liên kết, nó chỉ chạy tốt trên mac của tôi, nhưng tôi có thể không liên kết với Rust.
Trong Rust mã của tôi trông giống như sau:
//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();
}
}
Và tôi biên dịch với rustc main.rs -L .
(kể từ khi chia sẻ tập tin thư viện là địa phương).
Các lỗi tôi tạo ra trên Mac, khi biên soạn với một thư viện động (ghc -o libfibonacci.so -shared -static haskell/Fibonacci.o haskell/wrapper.o -lHSrts
rồi 'rustc main.rs -L.) Là tại thời gian chạy:
dyld: Symbol not found: _ffi_call
Referenced from: ./libfibonacci.so
Expected in: flat namespace
in ./libfibonacci.so
Trace/BPT trap: 5
Nhờ sự giúp đỡ trước.
Xin lỗi về điều đó. @Shepmaster --typo về phía tôi, nên là .c. – chalkandpaste
@ReidBarton Tôi cắt giảm tất cả những thứ không liên quan. Tập trung vào việc biên dịch một thư viện động trên mac của tôi bằng cách sử dụng Rust và Haskell. – chalkandpaste