gpt4 book ai didi

c++ - 在 haskell 的 FFI 后面使用 stdout/stderr/stdin 流

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:12 26 4
gpt4 key购买 nike

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

  • 是 ghc 劫持了这三个流(stdout、stdin、stderr)还是 libstdc++ 只是因为我正在与 ghc 链接而没有初始化它们?
  • 如果我的 FFI 导入写入标准输出,它们是否需要“安全”?
  • 如何将标准输出传递给 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

驱动.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.ccLinking Main ...$ ./MainStarting in C++Now in HaskellBack in C++

关于c++ - 在 haskell 的 FFI 后面使用 stdout/stderr/stdin 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com