Bạn có thể xác định các hàm C của riêng mình để cấp phát, miễn phí, chèn, xóa, v.v. Các chức năng này có thể bọc vùng chứa C++ mà bạn muốn truy cập. Ví dụ:
extern "C" {
Obj * obj_create()
{
return new Obj();
}
void obj_destroy(Obj * schema)
{
delete obj;
obj = NULL;
}
...
...
}
sau đó khai báo trong FFI và bọc chúng theo bất kỳ cách nào bạn muốn.
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())
Một số vấn đề:
- Hãy chắc chắn rằng bạn biên dịch các tập tin C với C++ biên dịch (g ++ thay vì gcc). điều này sẽ đảm bảo rằng các stdC++ libs được chọn chính xác.
- Vượt qua những địa điểm thư viện (-L) và libs (-lboost *) để liên kết trong khi biên dịch chương trình/lib ở phía Haskell
Bạn có cần phải sửa đổi các yếu tố cá nhân ở phía bên Haskell? –
@JohnL, không, chỉ cần gọi các chức năng với chúng, ví dụ: 'do {a <- cpp_getVector(); forM a cpp_f} 'where' cpp_f :: ElementType -> IO() ' – gatoatigrado