2013-07-23 60 views
15

我在QtC++)中構建了一個應用程序,它使用Haskell編寫的庫作爲後端。如何將Haskell庫的接口導出到C++從C++調用Haskell庫

當haskell庫中的函數使用簡單類型,如intfloat這不是問題,但是當他們使用結構作爲參數時會發生什麼?這種情況下最可擴展的解決方案是什麼?

+1

如何使用[UNIX域套接字](https://en.wikipedia.org/wiki/Unix_domain_socket)執行IPC? –

+1

IPC需要雙方進行編組。這是某種解決方案,但它仍然需要很多工作,並且效率不高。 – remdezx

+1

我沒有嘗試它,但它可能對你有用:https://github.com/wavewave/fficxx – Yuras

回答

3

您需要編寫haskell代碼來將這些數據結構編組爲可以在Haskell中使用的代碼。該c2hs工具在這方面非常有幫助:http://hackage.haskell.org/package/c2hs

雖然出現被設計用於哈斯克爾調用C的工具,它也是一個意義相反的非常有用 - 它可以讓你馬歇爾複雜的C類型轉換爲Haskell類型。既然你公開的函數需要C類型(通常指向複雜結構的指針),那麼你可以A)構造適當的C結構,並且B)使用c2hs提供的特性,然後將這些結構集成到Haskell中的暴露函數中,這樣你就可以和他們一起工作了。

另請注意,使用c2hs樣式生成的工具,您不需要編組所有內容。您只需生成訪問器即可查看您實際關心的C數據結構的各個部分。

+2

嗯,實際上,他想生成C頭文件/封裝來從C++代碼調用haskell函數。不要編寫C++代碼的haskell綁定。我想你已經讀過了。 –

+0

的確如此,我需要從C++調用haskell代碼。 – remdezx

+0

remdezx:看我的編輯 – sclv

2

遲到了,但我想你想用這個:

特別像foreign export ccall foo :: Int -> IO Int。這將產生一個頭,如:

#include "HsFFI.h" 
extern HsInt foo(HsInt a0); 

見鏈接查看更多細節(比如如何融入你的C++程序)。

+1

這個回答沒有增加什麼OP說他知道該怎麼做,尤其是它沒有解釋如何處理複雜的結構。 – bmaderbacher