haskell – 将OCaml代码与共享库相关联

我编译了一个
Haskell源包,实现了FFI作为(.so)动态库.我想调用通过OCaml中的FFI导出的函数.为此我实现了一个简单的驱动文件,如下所示

open Quelea.Shim
open Ctypes
open PosixTypes
open Foreign

let readEffects = 
    foreign "readEffects" (ptr char @-> ptr char @-> returning ptr string)

let effects = readEffects "csasc" "saxasxas"

print_list effects

let rec print_list = function 
                [] -> ()
                | e::l -> print_int e ; print_string " " ; print_list l

其中readEffects是通过FFI导出的Haskell源的Quelea.Shim模块中的函数,具有以下签名

foreign export ccall readEffects :: CString -> CString -> IO (Ptr CString)

我尝试编译上面的文件(main.ml),如下所示

 ocamlc -dllpath /home/parallels/.cabal/lib/Quelea-0.0.1/ghc-7.6.3 main.ml

目录/home/parallels/.cabal/lib/Quelea-0.0.1/ghc-7.6.3包含库文件libHSQuelea-0.0.1-ghc7.6.3.so.

我收到错误错误:未绑定模块Quelea.如何正确地将库与驱动程序文件链接?

最佳答案 似乎Quelea.Shim是Haskell的一个模块. OCaml是与Haskell不同的语言,因此无法理解Haskell模块路径.

我从未尝试过这样的事情,但可能的情况是:

>了解如何从普通的C程序加载Haskell模块和调用函数.
>编写一个小C函数来加载您想要的Haskell模块.可能它必须为OCaml准备Haskell函数的入口点.
>从OCaml调用加载程序

点赞