2012-02-27 2 views
7

나는 vector<MyClass>을 반환하는 함수를 가지고 있습니다. 이것을 FFI에 적합한 것으로 바꾸는 가장 좋은 방법은 무엇입니까?하스켈 FFI : C++ 모음을 어떻게 포장합니까?

:: [CIntPointer]과 같은 유형은 가능한 경우 얻을 수있는 좋은 타협이 될 수도 있습니다.

+0

당신이 하스켈 측의 개별 요소를 수정해야합니까 하스켈 측의 프로그램/lib 디렉토리를 컴파일 할 때의 링크를? –

+0

@ JohnL, 아니요, 그냥 함수를 호출하십시오. 'do {a <- cpp_getVector(); forM a cpp_f}'cpp_f :: ElementType -> IO()' – gatoatigrado

답변

3

alloc, free, insert, remove 등과 같은 C 함수를 정의 할 수 있습니다. 이러한 함수는 액세스하려는 C++ 컨테이너를 래핑 할 수 있습니다. 예를 들어 :

extern "C" { 

Obj * obj_create() 
{ 
    return new Obj(); 
} 

void obj_destroy(Obj * schema) 
{ 
    delete obj; 
    obj = NULL; 
} 
... 
... 
} 

다음 FFI에서 그들을 선언하고 그들에게 당신이 원하는 어떤 방법을 포장.
data SomeObject 

type Obj = Ptr SomeObject 

foreign import ccall unsafe "obj_create" 
    createObj :: IO Obj 

foreign import ccall unsafe "obj_destroy" 
    destroyObj_ :: Obj -> IO() 

foreign import ccall unsafe "&obj_destroy" 
    destroyObj :: FunPtr (Obj -> IO()) 

일부 둘점

:

  1. 당신이 C++ 컴파일러 (대신의 gcc g ++)로 C 파일을 컴파일해야합니다. 이렇게하면 stdC++ 라이브러리가 올바르게 선택됩니다.
  2. 라이브러리 위치 (-L)와 libs와 패스 (-lboost *)
+0

그래, 그게 내가하고있는 일이야. 고마워. – gatoatigrado