5

我正在开发一个使用我用 C++ 开发的外部静态库的小型 haskell 程序。它通过 ghc 的 FFI(外部函数接口)访问 lib。在这个库中,我想对控制台做一些输出。但是,在我看来,事情的 c++ 方面没有正确的标准输出句柄,因为输出没有出现在控制台上。那么,我的问题是:

  • ghc 会劫持这三个流(stdout、stdin、stderr)还是 libstdc++ 只是因为我与 ghc 链接而没有初始化它们?
  • 如果它们写入标准输出,我的 FFI 导入是否需要“安全”?
  • 如何将标准输出传递给 C 函数?我应该直接传递它还是需要一个 C 类型?

附加说明:我将 libstdc++ 直接链接到可执行文件(即 ghc -lstdc++ ...),我天真地认为这是正确的做法。似乎运作良好

免责声明:对 Haskell 来说还是很新的,所以现在是婴儿步骤;P

4

1 回答 1

4

您的问题似乎是 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 主要
[1 of 1] 编译 Main ( Main.hs, Main.o )
$ ghc --make -no-hs-main -lstdc++ 主驱动程序.cc
连接主...
$ ./主要
从 C++ 开始
现在在哈斯克尔
回到 C++
于 2009-12-16T22:40:42.063 回答