我在Qt
(C++
)中構建了一個應用程序,它使用Haskell編寫的庫作爲後端。如何將Haskell
庫的接口導出到C++
?從C++調用Haskell庫
當haskell庫中的函數使用簡單類型,如int
或float
這不是問題,但是當他們使用結構作爲參數時會發生什麼?這種情況下最可擴展的解決方案是什麼?
我在Qt
(C++
)中構建了一個應用程序,它使用Haskell編寫的庫作爲後端。如何將Haskell
庫的接口導出到C++
?從C++調用Haskell庫
當haskell庫中的函數使用簡單類型,如int
或float
這不是問題,但是當他們使用結構作爲參數時會發生什麼?這種情況下最可擴展的解決方案是什麼?
您需要編寫haskell代碼來將這些數據結構編組爲可以在Haskell中使用的代碼。該c2hs工具在這方面非常有幫助:http://hackage.haskell.org/package/c2hs
雖然出現被設計用於哈斯克爾調用C的工具,它也是一個意義相反的非常有用 - 它可以讓你馬歇爾複雜的C類型轉換爲Haskell類型。既然你公開的函數需要C類型(通常指向複雜結構的指針),那麼你可以A)構造適當的C結構,並且B)使用c2hs提供的特性,然後將這些結構集成到Haskell中的暴露函數中,這樣你就可以和他們一起工作了。
另請注意,使用c2hs樣式生成的工具,您不需要編組所有內容。您只需生成訪問器即可查看您實際關心的C數據結構的各個部分。
遲到了,但我想你想用這個:
特別像foreign export ccall foo :: Int -> IO Int
。這將產生一個頭,如:
#include "HsFFI.h"
extern HsInt foo(HsInt a0);
見鏈接查看更多細節(比如如何融入你的C++程序)。
這個回答沒有增加什麼OP說他知道該怎麼做,尤其是它沒有解釋如何處理複雜的結構。 – bmaderbacher
如何使用[UNIX域套接字](https://en.wikipedia.org/wiki/Unix_domain_socket)執行IPC? –
IPC需要雙方進行編組。這是某種解決方案,但它仍然需要很多工作,並且效率不高。 – remdezx
我沒有嘗試它,但它可能對你有用:https://github.com/wavewave/fficxx – Yuras