Vorrei creare una libreria dal codice Haskell e utilizzare ulteriormente questa libreria (libreria condivisa: dll o così) nel mio progetto C++.Differenze nella costruzione di una biblioteca con l'utilizzo di Cabal e GHC
Ho trovato semplice tutorial: http://blogging.makesmeanerd.com/?p=367 E ripetere con successo questo esempio.
Inoltre, ho semplificare questo esempio, e ottenere il codice seguente:
{-# LANGUAGE ForeignFunctionInterface #-}
module Grep where
import Foreign
import Foreign.C.String
import Data.Char
printCString :: CString -> IO()
printCString s = do
ss <- peekCString s
putStrLn ss
getCStringFromKey :: IO CString
getCStringFromKey = do
guess <- getLine
newCString guess
foreign export ccall printCString :: CString -> IO()
foreign export ccall getCStringFromKey :: IO CString
E 'programma molto semplice. Ho digitato prossimi comandi:
>ghc -c -O grep.hs
>ghc -shared -o grep.dll grep.o
Creating library file: grep.dll.a
Dopo, ho un paio di file: grep.dll, grep.dll.a e grep_stub.h (file di intestazione per il mio progetto C++). Ho usato con successo questa libreria nel progetto C++. Il codice C++ è molto semplice (ho usato MS Visual Studio):
#include <iostream>
#include <string>
#include "grep_stub.h"
int main(int argc, char* argv[])
{
std::string testStr;
hs_init(&argc, &argv);
HsPtr str1 = getCStringFromKey();
std::cout << "We've get from Haskell: " << (char*)str1 << std::endl;
HsPtr ss = "Hello from C++!";
printCString(ss);
std::cout << "Test application" << std::endl;
std::cin.get();
hs_exit();
return 0;
}
Dopo la compilazione, questo codice funziona molto bene.
Se io costruisco stesso codice Haskell (grep.hs) con l'utilizzo di Cabal sistema di compilazione:
name: grep
version: 1.0
synopsis: example shared library for C use
build-type: Simple
cabal-version: >=1.10
library
default-language: Haskell2010
exposed-modules: Grep
extra-libraries: HSrts-ghc7.6.3
extensions: ForeignFunctionInterface
build-depends: base >= 4
Ed eseguire Cabal sistema di compilazione:
>cabal configure --enable-shared
>cabal build
...
Creating library file: dist\build\libHSgrep-1.0-ghc7.6.3.dll.a
ho avuto un altro dll (con dimensioni ridotte) , ma non posso usare questa DLL in MS VS, perché ho un sacco di errori linker (sempre se ottengo dll.a file dalla piattaforma Haskell).
domande principali:
- Qual è la differenza tra biblioteca di compilazione con Cabal e GHC?
- Come posso creare la stessa dll con Cabal, come ottengo con GHC?
È possibile eseguire 'cabal build -v2'? Mostra i comandi eseguiti dalla cabala – bennofs
Sì, ma non è chiaro per me, come posso usare il sistema di cabal build per build equivalente con l'utilizzo manuale di GHC – Simplex
in esecuzione 'cabal build -v2' potrebbe darti un suggerimento su cosa è diverso nel Costruzione della cabala rispetto alla semplice build ghc. – bennofs