2016-11-27 2 views
4

(.so) 동적 라이브러리로 FFI를 구현하는 하스켈 소스 패키지를 컴파일했습니다. OCaml에서 FFI를 통해 내보내는 함수를 호출하고 싶습니다. readEffects 내가 컴파일하려고 다음과 같은 서명OCaml 코드를 공유 라이브러리와 연결

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

로 FFI를 통해 내 보낸 하스켈 소스의 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) 위의 파일은

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

Quelea.Shim은 하스켈의 모듈입니다. OCaml은 Haskell과 다른 언어이므로 Haskell 모듈 경로를 이해할 수 없습니다.

  • 보통의 C 프로그램에서 하스켈 모듈 및 통화 기능을로드하는 방법을 이해 :

    나는 가능한 시나리오 그러나이 같은 뭔가를 해본 적이있다.
  • 작은 C 함수를 작성하여 원하는 Haskell 모듈을로드하십시오. 아마도 OCaml을위한 Haskell 함수의 엔트리 포인트를 준비해야 할 것이다.
  • OCaml에서 로더 호출
관련 문제