2013-07-23 10 views
15

Ich baue eine Anwendung in Qt (C++), die Bibliothek in Haskell als Backend geschrieben verwendet. Wie kann ich die Schnittstelle Haskell Bibliothek zu C++ exportieren?Haskell-Bibliothek aus C++ aufrufen

Wenn Funktionen in Haskell-Bibliothek einfache Typen wie int oder float verwenden, ist es kein Problem, aber was, wenn sie Strukturen als Argumente verwenden? Was ist die skalierbarste Lösung in diesem Fall?

+1

Wie wäre es mit IPC mit einem [UNIX-Domain-Socket] (https://en.wikipedia.org/wiki/Unix_domain_socket)? –

+1

IPC muss auf beiden Seiten übertragen werden. Das ist die Art von Lösung, aber es erfordert immer noch viel Arbeit und ist nicht effizient, wie es sein könnte. – remdezx

+1

Ich habe es nicht versucht, aber es könnte nützlich für Sie sein: https://github.com/wavewave/fficxx – Yuras

Antwort

3

Sie müssen Haskell-Code schreiben, um diese Datenstrukturen in solche zu maskieren, die Sie in Haskell verwenden können. Das c2hs Tool ist sehr hilfreich in dieser Hinsicht: http://hackage.haskell.org/package/c2hs

Während das Werkzeug erscheint für den Aufruf von C von Haskell gestaltet wird, ist es auch sehr nützlich für das Gegenteil in einem gewissen Sinne ist - ermöglicht es Ihnen, marshall Komplex C Typen in Haskell-Typen. Da die von Ihnen bereitgestellten Funktionen C-Typen annehmen müssen (in der Regel Zeiger auf komplexe Strukturen), können Sie A) geeignete C-Strukturen konstruieren und B) die Funktionen von c2hs verwenden, um diese Strukturen in Haskell in Ihren exponierten Funktionen zu marshallen damit du mit ihnen arbeiten kannst.

Beachten Sie auch, dass mit c2hs-Stil generierten Tools, müssen Sie nicht alles marshall. Sie können nur Accessoren generieren, um in die Teile von C-Datenstrukturen zu schauen, die Ihnen wirklich wichtig sind.

+2

Hum, eigentlich will er C-Header/Wrapping generieren, um Haskell-Funktionen aus C++ - Code aufzurufen. Haskell-Bindung von C++ - Code nicht schreiben. Ich denke du hast das Gegenteil gelesen. –

+0

Das stimmt, ich muss Haskell-Code von C++ aufrufen. – remdezx

+0

remdezx: siehe meine Bearbeitung – sclv

2

spät zur Party, aber ich glaube, Sie wollen, dass diese verwenden:

Speziell etwas wie foreign export ccall foo :: Int -> IO Int. Die einen Header wie generiert:

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

Siehe den Link für weitere Informationen (wie zum Beispiel, wie in C++ Programm zu integrieren).

+1

Diese Antwort fügt nichts zu dem bei, was das OP gesagt hat, dass er weiß, wie es zu tun ist, insbesondere erklärt es nicht, wie man mit komplexen Strukturen umgeht. – bmaderbacher

Verwandte Themen