문제

C ++에서 개발 한 외부 정적 라이브러리를 사용하는 작은 Haskell 프로그램을 개발하고 있습니다. GHC의 FFI (외부 기능 인터페이스)를 통해 LIB에 액세스합니다. 이 라이브러리 내에서는 콘솔에 약간의 출력을하고 싶습니다. 그러나, 그것은 외모 나에게 C ++ 측면은 콘솔에 출력이 나타나지 않기 때문에 STDOUT에 대한 올바른 핸들이 없습니다. 그렇다면 내 질문은 다음과 같습니다.

  • GHC는이 세 가지 스트림 (stdout, stdin, stderr)을 납치합니까?
  • 내 FFI 수입은 stdout에 편지를 쓰면 "안전"해야합니까?
  • stdout을 C 함수로 어떻게 전달할 수 있습니까? 간단히 전달해야합니까? 아니면 C 유형이 필요합니까?

추가 메모 : 나는 libstdc ++를 실행 파일 (예 : GHC -LSTDC ++ ...)에 직접 연결하고 있는데, 나는 이것을 수행하는 올바른 방법이라고 순진하게 가정했다. 잘 작동하는 것 같습니다

부인 성명: 여전히 Haskell을 처음 접 했으므로 지금은 아기를 밟습니다. P

도움이 되었습니까?

해결책

귀하의 문제는 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++
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top