2012-11-24 15 views
14

मैं विंडोज में एक छोटा सा हास्केल गेम बना रहा हूं, जहां हर बार जब उपयोगकर्ता कुंजी दबाता है तो मैं जवाब देना चाहता हूं। getCharbehaves strangely विंडोज़ पर, में conio.h में पहुंच प्राप्त करने के लिए मैं एफएफआई का उपयोग करता हूं, जैसा कि here वर्णित है। प्रासंगिक कोड है:कैबल एफएफआई निर्भरता

foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt 

यह ठीक काम करता है, जब मैं GHCi में इसे चलाने के लिए, या GHC साथ यह संकलन। मैं भी इसे से बाहर एक कबाल पैकेज बनाने की कोशिश करना चाहते हैं, तो this सवाल से विस्तार, मैं अपने कबाल फ़ाइल में निम्न शामिल हैं:

... 
executable noughts 
    Includes:   conio.h 
    Extra-libraries conio 
... 

लेकिन जब मैं cabal configure चलाने के लिए, यह मुझसे कहता है:

cabal: Missing dependency on a foreign library: 
* Missing C library: conio 

यह समझ में आता है, क्योंकि ...\Haskell Platform\2012.4.0.0\mingw के तहत conio.h फ़ाइल include निर्देशिका के तहत conio फ़ाइल ऑब्जेक्ट कोड प्रदान करने के लिए कोई है।

क्या मैं इसे सही तरीके से कर रहा हूं, और यदि हां, तो मैं कैसे पता लगा सकता हूं कि मेरी कैबेल फ़ाइल में कौन सी लाइब्रेरी शामिल है?

+2

विभिन्न पुस्तकालयों कि conio कार्यों प्रदान करते हैं। क्या आपने 'अतिरिक्त-पुस्तकालय: क्रिस्टल' या 'अतिरिक्त-पुस्तकालय: msvcrt'' की कोशिश की है? वैसे, एमएसडीएन के अनुसार, आपको 'getch' के बजाय' _getch' का उपयोग करना चाहिए, लेकिन हेडर फ़ाइल आपके लिए ऐसा कर सकती है। –

+1

ध्यान दें कि यह केवल विंडोज़ में ghc/ghci को प्रभावित करता है, और समाधान कोड विशेष रूप से WinHugs में काम नहीं करता है, इसलिए आपको इसे विशेष रूप से Windows/ghc के साथ संकलित करने की आवश्यकता है। – AndrewC

+1

@ टिनक्टरियस मैंने अभी 'अतिरिक्त-पुस्तकालय: msvcrt' और' अतिरिक्त-पुस्तकालय: crtdll' अकेले और संयोजन में कोशिश की है। इसने 'कैबल बिल्ड' के आउटपुट को नहीं बदला। मुझे अपने विजुअल स्टूडियो इंस्टॉलेशन के तहत 'msvcrt.lib' और 'crtdll.c' मिला, और उन्हें मेरे फ़ोल्डर में कॉपी किया, लेकिन इसमें कुछ भी नहीं बदला। – Boris

उत्तर

7

सबसे पहले, सी हेडर फ़ाइलों और पुस्तकालयों के बीच हमेशा एक-एक मैपिंग नहीं होता है। इस मामले में, conio.h में घोषित कार्यों को विभिन्न रनटाइम पुस्तकालयों में पाया जा सकता है, जैसे crtdll (बहिष्कृत) या msvcrt (पसंदीदा, मुझे लगता है)।

विंडोज पर हास्केल प्लेटफार्म के साथ

, कबाल .\mingw\lib में इन पुस्तकालयों (अपने हास्केल मंच निर्देशिका के अंतर्गत) के लिए दिखेगा: यदि आप msvcrt के लिए पूछना है, यह .\mingw\lib\libmsvcrt.a के लिए दिखेगा। यह विशिष्ट पुस्तकालय पहले से ही आपके हास्केल प्लेटफ़ॉर्म के साथ भेज दिया जाना चाहिए। (यदि आप lib*.a फ़ाइलों के साथ अन्य निर्देशिकाओं को इंगित करना चाहते हैं, तो आप Cabal के --extra-lib-dirs विकल्प का उपयोग कर सकते हैं।)

इस का एक छोटा सा उदाहरण निम्नानुसार होगा; इस Main.hs है:

{-# LANGUAGE ForeignFunctionInterface #-} 
import Foreign.C.Types 
foreign import ccall unsafe "conio.h _putch" c_putch :: CInt -> IO() 

main :: IO() 
main = do 
    c_putch . toEnum . fromEnum $ '!' 
    c_putch . toEnum . fromEnum $ '\n' 

और यह something-awesome.cabal होगा:

name:    something-awesome 
version:    0.1.0.0 
build-type:   Simple 
cabal-version:  >=1.8 

executable yay 
    main-is:    Main.hs 
    build-depends:  base ==4.5.* 

    includes:   conio.h 
    extra-libraries:  msvcrt 

यह ठीक काम करना चाहिए:

c:\tmp\something-awesome> dir /B 
Main.hs 
something-awesome.cabal 

c:\tmp\something-awesome> cabal configure 
Resolving dependencies... 
Configuring something-awesome-0.1.0.0... 

c:\tmp\something-awesome> cabal build 
Building something-awesome-0.1.0.0... 
Preprocessing executable 'yay' for something-awesome-0.1.0.0... 
[1 of 1] Compiling Main    (Main.hs, dist\build\yay\yay-tmp\Main.o) 
Linking dist\build\yay\yay.exe ... 

c:\tmp\something-awesome> dist\build\yay\yay.exe 
! 
+0

धन्यवाद, महान उदाहरण :) – Boris

+1

भविष्य के संदर्भ के लिए, क्या कहीं कहीं मैं देख सकता हूं कि कौन सी लाइब्रेरी एक समारोह प्रदान करती है? आप कैसे पता लगाया कि '_getch' msvcrt और crtdll द्वारा प्रदान किया गया है, और बाद वाले को बहिष्कृत किया गया है? लाइट गुगलिंग ने कुछ भी प्रकट नहीं किया। – Boris

+1

एमएसडीएन (कैनोनिकल विंडोज़ विकास मैनुअल) पर एक खराब प्रयास है, जो आमतौर पर दिए गए फ़ंक्शन के लिए उपयोग करने के लिए हेडर फ़ाइल और लाइब्रेरी देता है (आप इसे Google की 'साइट:' ऑपरेटर के साथ खोज सकते हैं)। [_getch और दोस्तों] पर लेख (http://msdn.microsoft.com/en-us/library/078sfkak%28v=vs.71%29.aspx) केवल उल्लेख करता है कि "सी रन-टाइम पुस्तकालयों के सभी संस्करण " इसका समर्थन करें। मेरी 'lib' निर्देशिका (सीआरटी = सी रन-टाइम) में' libcrtdll.a' और 'libmsvcrt.a' ढूंढने के बाद, मैंने फिर 'crtdll' और' msvcrt' के बीच के अंतर के लिए Google की खोज की, और यह पता लगाया कि पूर्व है विंडोज 95 युग से एक अवशेष। –

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