haskell हास्केल प्रोजेक्ट में डीएलएल का उपयोग कैसे करें?




shared-libraries ghc (3)

मैं एक हास्केल परियोजना में बाहरी पुस्तकालय, RDFox का उपयोग करना चाहता हूं।

संदर्भ: मैं जीएचसी 7.10 और stack का उपयोग करते हुए 64 बिट्स दोनों विंडोज और लिनक्स पर काम कर रहा हूं। आरडीएफओक्स सी ++ में प्रोग्राम किया गया है। आरडीएफओक्स साझा लाइब्रेरीज़ (.dll, .so) जावा और पायथन रैपर के साथ डाउनलोड किया जा सकता है।

उद्देश्य: मैं Haskell में अपनी परियोजना में RDFox (.dll, .so) से संकलित पुस्तकालयों का पुन: उपयोग करना चाहता हूं, इसलिए मुझे RDFox के लिए एक हास्केल रैपर बनाने की आवश्यकता है।

मुद्दे: हास्केल के लिए अपेक्षाकृत नया होने के नाते, मुझे यह जानने में कठिनाई है कि कहां से शुरू करना है। मुझे इस विषय के बारे में कई पेज मिले (हास्केल विकी और स्टैक ओवरफ्लो से), लेकिन वर्कफ़्लो और कॉन्फ़िगरेशन मुझे स्पष्ट नहीं है।

प्रश्न: मैं जानना चाहता हूं:

  1. विंडोज या लिनक्स (विभिन्न मशीनों, एक ही भंडार) पर निर्माण करने के लिए बाहरी पुस्तकालय का उपयोग करने के लिए स्टैक और कैबल को कॉन्फ़िगर कैसे करें।
  2. इस बाहरी पुस्तकालय पर इंटरैक्टिव परीक्षण के लिए जीएचसीआई को कैसे कॉन्फ़िगर करें।
  3. पाइथन रैपर का अनुवाद हास्केल में जाने का सबसे अच्छा तरीका है? मैं आरडीएफओक्स सी ++ कोड के विश्लेषण से बचना चाहता हूं।

  1. आपको अपनी .cabal फ़ाइल के executable अनुभाग में extra-libraries extra-lib-dirs और extra-libraries का उपयोग करने की आवश्यकता होगी जैसे:

    name:                 MyApp
    version:              0.1.0.0
    synopsis:
    homepage:
    author:               simon.bourne
    category:
    build-type:           Simple
    cabal-version:        >=1.10
    
    library
      exposed-modules:      HelloWorld
      build-depends:        base >= 4.7 && < 5
      hs-source-dirs:       src
      default-language:     Haskell2010
    
    executable MyApp
      main-is:              Main.hs
      extra-lib-dirs:       lib
      extra-libraries:      helloWorld
      build-depends:        base >= 4.7 && < 5,
                            MyApp
      hs-source-dirs:       app
    
    default-language: Haskell2010
    

    lib में अपने dll और .so रखो। चेतावनी दीजिये, यदि आप linux पर एक स्थिर लाइब्रेरी ( .a बजाय .a ) का उपयोग करते हैं तो आप लिंक ऑर्डर समस्याओं में भाग लेंगे।

    उदाहरण के लिए this देखें। नाम से मूर्ख मत बनो क्योंकि यह .so फाइलों के साथ ठीक काम करता है।

  2. stack ghci सिर्फ काम करना चाहिए बशर्ते यह आपकी लाइब्रेरी (लिनक्स पर LD_LIBRARY_PATH ) पा सकें।

  3. सी एपीआई (आपके प्रश्न पर टिप्पणियों में उल्लिखित) पहले से ही वहां है। आपको केवल हास्केल एफएफआई हस्ताक्षर लिखने की जरूरत है, उदाहरण के लिए:

    foreign import ccall safe "helloWorld" c_helloWorld :: IO ()
    

    मैं safe ccalls का उपयोग करके बहुत दृढ़ता से सलाह देता हूं, और असुरक्षित पैराफॉर्मियो में फ़ंक्शंस को unsafePerformIO

    यदि आपको गैर अपारदर्शी structs को पारित करने की आवश्यकता है, तो आप c2hs या hsc2hs जांच करना hsc2hs , लेकिन मुझे नहीं लगता कि आपको इसकी आवश्यकता होगी। अधिक जानकारी question लिए यह question देखें।


आपको सी ++ एपीआई और हास्केल रैपर के लिए सी-निर्यात किए गए रैपर को एफएफआई से सी-निर्यातित रैपर में बनाने की आवश्यकता है।

सी # और हास्केल के बीच मार्शलिंग ने यहां वर्णित किया: सी # से हास्केल को कॉल करना

लेकिन यह सी ++ और हास्केल के बीच बहुत ही समान मार्शलिंग है

उदाहरण के लिए, सी ++ निर्यात फ़ंक्शन बनाएं:

extern "C" __declspec(dllexport) int __cdecl addFive(int number);

extern "C" __declspec(dllexport) int __cdecl addFive(int number)
{
    return number + 5;
}

हास्केल में आपको आयात कोड की आवश्यकता है:

foreign import ccall "addFive" addFive :: Int -> Int

फिर आप हास्केल में एडस्किव का उपयोग सामान्य हास्केल-फ़ंक्शन के रूप में कर सकते हैं

कंपाउंड डेटा प्रकारों (कक्षाओं और संरचनाओं) के लिए आपको Haskell में C ++ डेटा-प्रकार एनालॉग बनाने की आवश्यकता है। फिर आपको वर्णन करना होगा कि सी ++ से हास्केल तक और मास्कल से सी ++ तक मार्शल डेटा प्रकार कैसे हैं।

हास्केल में इसका मतलब है कि आपको डेटा प्रकारों के लिए स्टेरियल इंस्टेंस बनाने की आवश्यकता है।






haskell-stack