2014-05-08 8 views
7

का उपयोग करने के साथ लाइब्रेरी भवन में मतभेद मैं हास्केल कोड से लाइब्रेरी बनाना चाहता हूं, और आगे मेरी सी ++ प्रोजेक्ट में इस लाइब्रेरी (साझा लाइब्रेरी: डीएल या तो) का उपयोग करना चाहता हूं।कैबेल और जीएचसी

मुझे सरल ट्यूटोरियल मिला: http://blogging.makesmeanerd.com/?p=367 और सफल उदाहरण इस उदाहरण को दोहराएं।

इसके अलावा, मैं इस उदाहरण को आसान बनाने, और अगले कोड प्राप्त:

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

यह बहुत ही सरल कार्यक्रम।

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

के बाद, मैं कुछ फ़ाइलें: (मेरी सी ++ परियोजना के लिए हेडर फाइल) grep.dll, grep.dll.a और grep_stub.h मैं अगले आदेशों टाइप किया है। मैं इस पुस्तकालय का उपयोग C++ प्रोजेक्ट में सफल करता हूं। सी ++ कोड बहुत सरल है (मैंने एमएस विजुअल स्टूडियो का उपयोग किया):

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

संकलन के बाद, यह कोड बहुत अच्छी तरह से काम करता है।

अगर मैं कबाल निर्माण प्रणाली का उपयोग कर के साथ एक ही हास्केल कोड (grep.hs) का निर्माण:

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 

और कबाल निर्माण सिस्टम को चलाने:

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

मैं एक dll मिल गया (छोटे आकार के साथ) , लेकिन मैं एमएस वीएस में इस डीएल का उपयोग नहीं कर सकता, क्योंकि मुझे बहुत सारे लिंकर त्रुटियां मिलती हैं (कभी भी अगर मुझे हास्केल प्लेटफ़ॉर्म से dll.a फ़ाइलें मिलती हैं)।

मुख्य सवाल:

  • कबाल और GHC साथ निर्माण पुस्तकालय के बीच क्या अंतर है?
  • मैं कैबल के साथ एक ही डीएलएल कैसे बना सकता हूं, क्योंकि मुझे जीएचसी के साथ मिलता है?
+0

क्या आप 'कैबल बिल्ड-वी 2' चला सकते हैं? यह कमांड कैबल निष्पादित करता है – bennofs

+0

हां, लेकिन यह मेरे लिए स्पष्ट नहीं है, मैं मैन्युअल रूप से जीएचसी – Simplex

+3

चलाने के साथ समकक्ष निर्माण के लिए कैबल बिल्ड सिस्टम का उपयोग कैसे कर सकता हूं 'कैबल बिल्ड-वी 2' चलने से आपको संकेत मिलता है कि इसमें क्या अंतर है सादा ghc निर्माण की तुलना में Cabal निर्माण। – bennofs

उत्तर

1

आप अपनी लाइब्रेरी सेटिंग्स में ghc-options जोड़कर कैबल फ़ाइल में अतिरिक्त विकल्प सेट कर सकते हैं। सुनिश्चित नहीं हैं कि आपके मामले में जरूरत है, लेकिन मैं एक ही मुद्दा (छोटे lib, लिंकर त्रुटियों) में चलाने की है और मेरे लिए निम्नलिखित सेटिंग इसे हल:

ghc-options: -staticlib

लेकिन मैं का उपयोग करें कि एक iOS परियोजना में एक्सकोड में

संबंधित मुद्दे