Pregunta

Estoy desarrollando un pequeño programa Haskell que utiliza una biblioteca estática externa que he desarrollado en C ++. Accede a la lib través de FFI de GHC (interfaz de la función externa). Dentro de esta biblioteca me gustaría hacer alguna salida a la consola. Sin embargo, ve a mí como el lado ++ c de las cosas no tiene un mango correcta a la salida estándar porque la producción no aparece en la consola. Por esto, mis preguntas son:

  • ¿El GHC secuestro de estas tres corrientes (la salida estándar, la entrada estándar, stderr) o libstdc ++ es simplemente no inicializar porque estoy vinculación con GHC?
  • Hacer mi FFI importaciones tienen que ser "seguro" si escriben en la salida estándar?
  • ¿Cómo puedo pasar a la salida estándar a una función de C? Debería simplemente pasarlo directamente o necesito un tipo C?

Notas adicionales: estoy une libstdc ++ directamente al ejecutable (es decir ghc -lstdc ++ ...) que ingenuamente supuse sería la forma correcta de hacer esto. Parece funcionar bien

Renuncia: Todavía bastante nuevo en Haskell, por lo que los pasos del bebé por ahora; P

¿Fue útil?

Solución

Su problema parece ser que libstdc ++ no está siendo inicializado. No estoy del todo seguro de por qué - -lstdc++ es suficiente en mi sistema - pero a ver si funciona al revés

.

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

Compilación:

$ 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top