Domanda

sto sviluppando un piccolo programma Haskell che utilizza una libreria statica esterna che ho sviluppato in C ++. Si accede al lib attraverso FFI di GHC (interfaccia funzione di stranieri). All'interno di questa libreria mi piacerebbe fare un po 'di output alla console. Tuttavia, Look a me come l'++ lato c delle cose non ha una corretta impugnatura per stdout perché l'uscita non viene visualizzata sulla console. Allora, le mie domande sono:

  • Fa ghc dirottare questi tre flussi (stdout, stdin, stderr) o è libstdc ++ semplicemente non l'inizializzazione di loro perché sono il collegamento con GHC?
  • Fare il mio FFI importazioni hanno bisogno di essere "sicuro" se scrivono a stdout?
  • Come posso passare stdout a una funzione C? Dovrei semplicemente passare direttamente o ho bisogno di un tipo C?

Note aggiuntive: sto collegando libstdc ++ direttamente all'eseguibile (vale a dire GHC -lstdc ++ ...) che ho ingenuamente pensato sarebbe il modo corretto di fare questo. Sembra funzionare bene

Avviso: Ancora abbastanza nuovo per Haskell, così piccoli passi per ora; P

È stato utile?

Soluzione

Il tuo problema sembra essere che libstdc ++ non viene inizializzato. Non sono del tutto sicuro perché - -lstdc++ è sufficiente sul mio sistema - ma vedere se funziona il contrario

.

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

Compilazione:

$ 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++
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top