का उपयोग करने के साथ लाइब्रेरी भवन में मतभेद मैं हास्केल कोड से लाइब्रेरी बनाना चाहता हूं, और आगे मेरी सी ++ प्रोजेक्ट में इस लाइब्रेरी (साझा लाइब्रेरी: डीएल या तो) का उपयोग करना चाहता हूं।कैबेल और जीएचसी
मुझे सरल ट्यूटोरियल मिला: 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 साथ निर्माण पुस्तकालय के बीच क्या अंतर है?
- मैं कैबल के साथ एक ही डीएलएल कैसे बना सकता हूं, क्योंकि मुझे जीएचसी के साथ मिलता है?
क्या आप 'कैबल बिल्ड-वी 2' चला सकते हैं? यह कमांड कैबल निष्पादित करता है – bennofs
हां, लेकिन यह मेरे लिए स्पष्ट नहीं है, मैं मैन्युअल रूप से जीएचसी – Simplex
चलाने के साथ समकक्ष निर्माण के लिए कैबल बिल्ड सिस्टम का उपयोग कैसे कर सकता हूं 'कैबल बिल्ड-वी 2' चलने से आपको संकेत मिलता है कि इसमें क्या अंतर है सादा ghc निर्माण की तुलना में Cabal निर्माण। – bennofs