Используя stdout/stderr/stdin потоки позади FFI haskell

Я разрабатываю маленькую haskell программу, которая пользуется внешней статической библиотекой, которую я разработал в C++. Это получает доступ к lib через FFI ghc (внешний функциональный интерфейс). В этой библиотеке я хотел бы сделать некоторый вывод к консоли. Однако это смотрит на меня как сторона C++ вещей, не имеет корректного дескриптора к stdout, потому что произведенный не появляется на консоли. Таким образом мои вопросы:

  • ghc угоняет эти три потока (stdout, stdin, stderr) или является libstdc ++ просто не инициализация их, потому что я связываюсь с ghc?
  • Мой импорт FFI должен быть "безопасным", если они пишут в stdout?
  • Как я могу передать stdout функции C? Я должен просто передать его непосредственно, или мне нужен тип C?

Дополнительные примечания: я связываю libstdc ++ непосредственно к исполняемому файлу (т.е. ghc-lstdc ++...), который я наивно принял, будет корректный способ сделать это. Кажется, работает хорошо

Отказ от ответственности: Все еще довольно в новинку для Haskell, таким образом, маленькие шаги на данный момент; P

5
задан Rehno Lindeque 16 December 2009 в 21:31
поделиться

1 ответ

Похоже, проблема в том, что 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++
4
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: