我的发展中小haskell程序,使用外部的静态图书馆我已经开发了在C++。它访问lib通过全康的FFI(外地功能的接口)。这里面的图书馆我想做一些输出到控制台。然而,它的 看起来 我喜欢c++方面的事情没有一个正确的处理,以stdout因为输出不会出现在控制台上。那么,我的问题是:

  • 不ghc劫持这三个流(stdout,stdin,stderr)或是一般++根本不初始化它们的因为我是联ghc?
  • 做我的FFI进口需要的是"安全"如果他们写信给stdout?
  • 我如何可以通过stdout C功能?我应该简单地通过直接或我需要一个C类型?

附加说明: 我是联般++直接向执行(即ghc-lstdc++...)我天真地认为,正确的方法这样做。似乎运作良好

免责声明: 仍然漂亮的新Haskell,所以婴儿的步骤;P

有帮助吗?

解决方案

你的问题不会出现,般++没有被初始化。我完全不知道为什么— -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