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