将OCaml代码与共享库相关联

时间:2016-11-27 17:45:45

标签: haskell ocaml ffi

我编译了一个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

我收到错误Error: Unbound module Quelea。如何正确地将库与驱动程序文件链接?

1 个答案:

答案 0 :(得分:1)

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

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

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