2009-12-16 35 views
5

'un arkasındaki stdout/stderr/stdin akışlarını kullanarak, C++ 'da geliştirdiğim harici bir statik kütüphaneyi kullanan küçük bir hata programı geliştiriyorum. Libya'ya ghc'nin FFI (yabancı fonksiyon arayüzü) üzerinden erişir. Bu kütüphanenin içinde konsola biraz çıkış yapmak istiyorum. Ancak, görünüyor bana gibi şeyler konsolda görünmüyor çünkü şeyler C++ tarafı stdout için doğru bir tanıtıcı yoktur. Öyleyse, benim sorular şunlardır:Stkut/stderr/stdin akışlarını, FFI

  • ghc bu üç akışları (stdout stdin, Stderr) kaçırmak ya da ben ghc ile bağlantı olduğum için sadece onları değil başlatılıyor ++ libstdc mi barındırıyor?
  • FFI ithalatımın stdout'a yazıyorsa "güvenli" olması gerekir mi?
  • Stdout'u bir C işlevine nasıl geçirebilirim? Sadece doğrudan iletmeli miyim yoksa bir C tipine mi ihtiyacım var?

ek notlar: Ben ++ doğrudan yürütülebilir libstdc bağlama ediyorum (yani ghc -lstdC++ ...) Ben safça bunu yapmanın doğru yolu olacağını kabul hangi. iyi

Yasal çalışmaya görünüyor: şimdilik Haskell oldukça yeni Yine, böylece bebek adımlarıyla P

cevap

4

Senin sorunun başlatıldı olmadığını libstdC++ gibi görünmemektedir. Sistemimde — -lstdc++ neden yeterli olduğunu tam olarak emin değilim, — sistemimde yeterli olup olmadığına bakın. Derleme

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

:

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

 
$ 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

Sorun sandalye ve klavye arasındaydı ortaya çıktı. Haskell ile yaşadığım tecrübemden dolayı aptalca olmayan bir hata yaptım. Cevabınız oldukça yardımcı oldu çünkü stdlibC++ aslında doğru bir şekilde başlatıyor ve sadece bir moron olmaktan çıktı. Bu nedenle kabul ettiğim cevabı aldınız. Teşekkürler! –

İlgili konular