2009-12-16 12 views
5

के पीछे stdout/stderr/stdin धाराओं का उपयोग करना मैं एक छोटा सा हैकेल प्रोग्राम विकसित कर रहा हूं जो सी ++ में विकसित एक बाहरी स्थैतिक पुस्तकालय का उपयोग करता है। यह ghc के एफएफआई (विदेशी फ़ंक्शन इंटरफ़ेस) के माध्यम से lib को एक्सेस करता है। इस पुस्तकालय के अंदर मैं कंसोल में कुछ आउटपुट करना चाहता हूं। हालांकि, यह मुझे दिखता है जैसे कि सी ++ चीजों के पक्ष में stdout के लिए सही हैंडल नहीं है क्योंकि आउटपुट कंसोल पर दिखाई नहीं देता है। तो फिर, मेरे प्रश्न हैं:हैकेल के एफएफआई

  • GHC इन तीन धाराओं (stdout, stdin, stderr) का अपहरण या ++ libstdc है बस उन्हें आरंभ नहीं है क्योंकि मैं GHC के साथ जोड़ने कर रहा हूँ है?
  • क्या मेरे एफएफआई आयातों को "सुरक्षित" होने की आवश्यकता है यदि वे stdout लिखते हैं?
  • मैं सी समारोह में stdout कैसे पास कर सकता हूं? क्या मुझे इसे सीधे पास करना चाहिए या क्या मुझे सी प्रकार की आवश्यकता है?

अतिरिक्त नोट्स: मैं libstdc जोड़ने रहा हूँ निष्पादन के लिए सीधे ++ (अर्थात GHC -lstdC++ ...) जो मैं भोलेपन ग्रहण ऐसा करने का सही तरीका होगा। अच्छी तरह से

अस्वीकरण काम करने के लिए लगता है: अब के लिए फिर भी सुंदर हास्केल के लिए नया है, तो बच्चे होते हैं; पी

उत्तर

4

आपका समस्या यह है कि libstdC++ आरंभ नहीं की जा रही है प्रतीत होता है। मुझे पूरा यकीन नहीं है कि क्यों — -lstdc++ मेरे सिस्टम — पर पर्याप्त है लेकिन देखें कि यह अन्य तरीकों से काम करता है या नहीं।

Main.hs:

{-# LANGUAGE ForeignFunctionInterface #-} 
module Main where 
foreign export ccall "Main_main" main :: IO() 
foreign import ccall driver_callback :: IO() 
main = putStrLn "Now in Haskell" >> driver_callback 

driver.cc:

#include <iostream> 

extern "C" { 
# include "HsFFI.h" 

# ifdef __GLASGOW_HASKELL__ 
# include "Main_stub.h" 
    extern void __stginit_Main(void); 
# endif 

    void driver_callback(void) { 
     std::cout << "Back in C++" << std::endl; 
    } 
} 

int main(int argc, char **argv) { 
    hs_init(&argc, &argv); 
# ifdef __GLASGOW_HASKELL__ 
    hs_add_root(__stginit_Main); 
# endif 

    std::cout << "Starting in C++" << std::endl; 

    Main_main(); 

    hs_exit(); 
    return 0; 
} 

संकलन:

 
$ ghc -c --make Main 
[1 of 1] Compiling Main    (Main.hs, Main.o) 
$ ghc --make -no-hs-main -lstdc++ Main driver.cc 
Linking Main ... 
$ ./Main 
Starting in C++ 
Now in Haskell 
Back in C++ 
+1

यह पता चला समस्या कुर्सी और कीबोर्ड के बीच था। मैंने हास्केल के साथ अपने अनुभवहीनता के कारण एक मूर्खतापूर्ण असंबद्ध गलती की। आपका जवाब काफी मददगार था क्योंकि इससे मुझे यह सुनिश्चित करने में मदद मिली कि stdlibC++ वास्तव में सही ढंग से प्रारंभ होता है और मैं केवल एक मूर्खतापूर्ण था। इस कारण से आप मेरा स्वीकार्य उत्तर प्राप्त करते हैं। धन्यवाद! –