2014-05-08 24 views
7

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?
+0

È possibile eseguire 'cabal build -v2'? Mostra i comandi eseguiti dalla cabala – bennofs

+0

Sì, ma non è chiaro per me, come posso usare il sistema di cabal build per build equivalente con l'utilizzo manuale di GHC – Simplex

+3

in esecuzione 'cabal build -v2' potrebbe darti un suggerimento su cosa è diverso nel Costruzione della cabala rispetto alla semplice build ghc. – bennofs

risposta

1

È possibile impostare opzioni aggiuntive nel file cabal aggiungendo ghc-options alle impostazioni della libreria. Non sei sicuro di ciò che è necessario nel tuo caso, ma ho incontrato lo stesso problema (piccola lib, errori del linker) e per me la seguente impostazione risolto:

ghc-options: -staticlib

ma io uso che in un progetto di iOS in Xcode.