2014-05-08 38 views
7

Haskell kodundan kütüphane oluşturmak ve C++ projemde bu kütüphaneyi (paylaşılan kütüphane: dll veya benzeri) kullanmak istiyorum.Cabal ve GHC kullanarak kütüphane binasındaki farklar

Basit eğitici bulduğum: http://blogging.makesmeanerd.com/?p=367 Ve bu örneği başarılı bir şekilde yineleyin.

Ayrıca, ben bu örneği basitleştirmek ve bir sonraki kodu almak:

{-# 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 

Öyle çok basit bir program. , Birkaç dosyaları sonra

>ghc -c -O grep.hs 
>ghc -shared -o grep.dll grep.o 
Creating library file: grep.dll.a 

: (benim C++ proje için başlık dosyası) grep.dll, grep.dll.a ve grep_stub.h sonraki komutlar yazdınız. Bu kütüphaneyi C++ projesinde başarılı bir şekilde kullanıyorum. C++ kodu çok basittir (MS Visual Studio kullandım):

#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; 
} 

Derleme sonrasında bu kod çok iyi çalışır.

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 

Ve Cabal yapı sistemi çalıştırmak: Ben Cabal yapılandırma sistemi kullanarak aynı Haskell kod (grep.hs) kurarsan

>cabal configure --enable-shared 
>cabal build 
... 
Creating library file: dist\build\libHSgrep-1.0-ghc7.6.3.dll.a 

Başka dll var (küçük boyutu ile) , ama ben MS VS bu dll kullanamazsınız, çünkü ben çok sayıda bağlayıcı hataları (Hashell Platform dll.a dosyaları olsun) olsun.

Ana sorular:

  • Cabal'a ve ghc ile inşa kütüphane arasındaki fark nedir?
  • GHC ile elde ettiğim gibi Cabal ile aynı dll'yi nasıl kurabilirim?
+0

'cabal build -v2' çalıştırabilir misiniz? Bu cabal komutları gösterir – bennofs

+0

Evet, ama benim için açık değil, el ile GHC – Simplex

+3

çalıştıran eşdeğer yapı için cabal build sistemi nasıl kullanabilirim? Cabal build -v2 'size farklı ne hakkında bir ipucu verebilir Düz ghc yapı ile karşılaştırıldığında Cabal yapı. – bennofs

cevap

1

Kitaplık ayarlarınıza ghc-options ekleyerek cabal dosyasında ek seçenekler ayarlayabilirsiniz.

ghc-options: -staticlib

Ama bir iOS projesinde olduğu kullanın: sizin durumunuzda gereklidir, ancak aynı konuda (küçük lib, bağlayıcı hataları) içine çalıştırmak ve benim için Aşağıdaki ayar Çözmedim emin ne Xcode'ta.