2009-12-16 2 views
5

저는 C++에서 개발 한 외부 정적 라이브러리를 사용하는 작은 haskell 프로그램을 개발 중입니다. ghc의 FFI (외부 함수 인터페이스)를 통해 lib에 액세스합니다. 이 라이브러리 안에 콘솔에 출력하고 싶습니다. 그러나, 보이는 내게 보이는 C + + 측면의 출력이 콘솔에 나타나지 않기 때문에 stdout에 올바른 핸들을 가지고 있지 않습니다. 그럼, 내 질문은 :haskell의 FFI 뒤에 stdout/stderr/stdin 스트림 사용

  • 는 GHC이 세 스트림 (표준 출력, 표준 입력, 표준 에러)를 납치 또는 내가 GHC와 연결하고 있습니다 때문에 단순히 초기화하지 ++ 된 libstdc입니다합니까?
  • stdout에 글을 쓰면 FFI 가져 오기가 "안전"해야합니까?
  • stdout을 C 함수에 전달하는 방법은 무엇입니까? 나는 단순히 그것을 직접 전달해야합니까, 아니면 C 타입이 필요합니까?

추가 참고 : 나는 ++ 직접 실행에 된 libstdc 연결하고있어 (즉 GHC -lstdC++ ...) 나는 순진하게도이 일을 올바른 방법이 될 것이라고 가정한다. 잘

면책 조항 작동하는 것 같다 : 지금은 하스켈 꽤 새로운 여전히, 그래서 아기 단계; P

답변

4

귀하의 문제가 초기화되지 않는이 된 libstdC++ 것으로 보인다 않습니다. 나는 왜 — -lstdc++이 내 시스템에서 충분하다고 확신하지 못한다. —하지만 다른 방법으로 돌아가는지 확인한다. 컴파일

#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

이 문제가 의자와 키보드 사이였다 밝혀졌다. 나는 하스켈에 대한 나의 미숙함 때문에 바보 같은 무관 한 실수를 저질렀다. 귀하의 대답은 제가 stdlibC++가 실제로 올바르게 초기화된다는 것을 입증하는 데 도움이되었고, 저는 단지 약간의 바보였습니다. 이런 이유로 당신은 나의 받아 들여진 응답을 얻는다. 감사! –