2009-12-16 16 views
5

Zajmuję się tworzeniem małego programu do programowania, który wykorzystuje zewnętrzną bibliotekę statyczną, którą opracowałem w C++. Uzyskuje dostęp do biblioteki lib poprzez FFI ghc (interfejs funkcji obcych). Wewnątrz tej biblioteki chciałbym wykonać pewne wyjście do konsoli. Jednak dla mnie wygląda tak, jakby strona C++ nie miała poprawnego uchwytu na stdout, ponieważ dane wyjściowe nie pojawiają się na konsoli. Tak więc, moje pytania są następujące:Używanie strumieni stdout/stderr/stdin za FKF firmy haskell

  • Czy ghc porwać te trzy strumienie (stdout, stdin, stderr) lub jest libstdC++ po prostu nie je inicjalizacji bo jestem łączenie z GHC?
  • Czy mój import FFI musi być "bezpieczny", jeśli pisze się na standardowe wyjście?
  • Jak mogę przekazać standardowe wyjście do funkcji C? Czy powinienem po prostu przekazać to bezpośrednio, czy też potrzebuję typu C?

Uwagi dodatkowe: jestem łącząc libstdC++ bezpośrednio do pliku wykonywalnego (tj ghc -lstdC++ ...), który naiwnie zakłada byłby poprawny sposób to robi. Wydaje się działać dobrze

Zastrzeżenie: jeszcze dość nowy do Haskell, więc kroki dziecka do teraz; P

Odpowiedz

4

Twój problem wydaje się, że libstdC++ nie jest zainicjowany. Nie jestem do końca pewien, dlaczego — -lstdc++ jest wystarczająca w moim systemie —, ale zobacz, czy działa na odwrót.

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

Kompilacja:

 
$ 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

Okazało się problemem było między krzesłem a klawiaturą. Zrobiłem głupi niepowiązany błąd z powodu mojego braku doświadczenia z Haskellem. Twoja odpowiedź była bardzo pomocna, ponieważ pomogła mi ustalić, że stdlibC++ faktycznie inicjuje się poprawnie, a ja po prostu bym był trochę kretynem. Z tego powodu otrzymujesz moją akceptowaną odpowiedź. Dzięki! –

Powiązane problemy