2016-11-27 4 views
4

FFIを実装したHaskellソースパッケージを(.so)動的ライブラリとしてコンパイルしました。私は、OCamlでFFI経由でエクスポートされた関数を呼び出したいと思います。 readEffects私がコンパイルしようとした次のシグネチャOCamlコードと共有ライブラリのリンク

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

でFFIを介してエクスポートされたHaskellソースのQuelea.Shimモジュール内の関数である

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 

は、以下のように、このために、私は単純なドライバファイルを実装しました(main.ml)上記のファイルは、ディレクトリ/home/parallels/.cabal/lib/Quelea-0.0.1/ghc-7.6.3ライブラリファイルlibHSQuelea-0.0.1-ghc7.6.3.soが含まれている

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

に従います。

エラーError: Unbound module Queleaが表示されます。ライブラリをドライバファイルに正しくリンクするにはどうすればよいですか?

答えて

1

Quelea.Shimはハスケルのモジュールです。 OCamlはHaskellとは異なる言語であるため、Haskellのモジュールパスを理解することはできません。私は可能なシナリオが、このような何かを試したことがない

は次のとおりです。

  • Haskellのモジュールをロードして、通常のCプログラムから関数を呼び出す方法を理解します。
  • 希望するHaskellモジュールを読み込むための小さなC関数を記述します。おそらくOCamlのHaskell関数のエントリポイントを準備しなければならないでしょう。
  • OCamlからローダーを呼び出します。
関連する問題