2009-12-16 37 views
5

của haskell Tôi đang phát triển một chương trình haskell nhỏ sử dụng thư viện tĩnh bên ngoài mà tôi đã phát triển trong C++. Nó truy cập lib thông qua FFI của ghc (giao diện chức năng nước ngoài). Bên trong thư viện này tôi muốn làm một số đầu ra cho giao diện điều khiển. Tuy nhiên, nó trông với tôi như bên C++ của sự vật không có một xử lý chính xác để stdout vì đầu ra không xuất hiện trên bàn điều khiển. Vì vậy, sau đó, câu hỏi của tôi là:Sử dụng các luồng stdout/stderr/stdin sau FFI

  • Liệu GHC cướp ba suối (stdout, stdin, stderr) hoặc là libstdC++ đơn giản là không khởi tạo cho họ bởi vì tôi đang liên kết với GHC?
  • Việc nhập khẩu FFI của tôi có cần phải "an toàn" nếu họ viết để stdout không?
  • Làm cách nào để chuyển stdout sang hàm C? Tôi có nên đơn giản chuyển nó trực tiếp hay tôi cần loại C?

Ghi chú thêm: Tôi đang liên kết libstdC++ trực tiếp đến việc thực thi (ví dụ: GHC -lstdC++ ...) mà tôi ngây thơ giả định sẽ là con đường đúng để làm điều này. Dường như làm việc tốt

Disclaimer: Tuy khá mới để Haskell, vì vậy bước nhỏ cho bây giờ; P

Trả lời

4

Vấn đề của bạn không xuất hiện để được rằng libstdC++ không được khởi tạo. Tôi không hoàn toàn chắc chắn lý do tại sao — -lstdc++ là đủ trên hệ thống của tôi — nhưng xem nếu nó hoạt động theo cách khác xung quanh.

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

Biên soạn:

 
$ 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

Hóa ra vấn đề là giữa ghế và bàn phím. Tôi đã mắc phải một sai lầm ngớ ngẩn không liên quan do sự thiếu kinh nghiệm của tôi với Haskell. Câu trả lời của bạn khá hữu ích vì nó đã giúp tôi thiết lập rằng stdlibC++ thực sự khởi tạo chính xác và tôi chỉ đơn thuần là một chút moron. Vì lý do này bạn nhận được câu trả lời được chấp nhận của tôi. Cảm ơn! –

Các vấn đề liên quan