我编译了一个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
。如何正确地将库与驱动程序文件链接?
答案 0 :(得分:1)
似乎Quelea.Shim
是Haskell的一个模块。 OCaml是一种与Haskell不同的语言,因此无法理解Haskell模块路径。
我从未尝试过这样的事情,但可能的情况是: