Pergunta

Estou desenvolvendo um pequeno programa Haskell que usa uma biblioteca estática externa que desenvolvi no C ++. Ele acessa a LIB através da FFI da GHC (interface de função estrangeira). Dentro desta biblioteca, gostaria de fazer alguma saída no console. no entanto parece Para mim, como o lado C ++ das coisas, não possui uma alça correta para Stdout, porque a saída não aparece no console. Então, minhas perguntas são:

  • O GHC seqüestra esses três fluxos (stdout, stdin, stderr) ou libstdc ++ simplesmente não os inicializando porque estou vinculando ao GHC?
  • Minhas importações de FFI precisam ser "seguras" se elas escreverem para o stdout?
  • Como posso passar o stdout para uma função C? Devo simplesmente passar diretamente ou preciso de um tipo C?

Notas Adicionais: Estou vinculando libstdc ++ diretamente ao executável (ou seja, ghc -lstdc ++ ...) que eu supus que seria a maneira correta de fazer isso. Parece funcionar bem

Isenção de responsabilidade: Ainda bem novo em Haskell, então os passos do bebê por enquanto; P

Foi útil?

Solução

Seu problema parece ser que o libstdc ++ não está sendo inicializado. Não sei ao certo por que - -lstdc++ é suficiente no meu sistema - mas veja se funciona o contrário.

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;
}

Compilação:

$ 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++
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top