Question

Je développe un petit programme qui utilise haskell une bibliothèque statique externe que j'ai développé en C ++. Il accède à la lib par l'IFF de GHC (interface de fonction étrangère). Dans cette bibliothèque, je voudrais faire une sortie sur la console. Cependant, il regarde pour moi comme le c ++ côté des choses ne dispose pas d'une poignée correcte à stdout parce que la production ne figure pas sur la console. Alors, mes questions sont:

  • Est-ce que ces trois GHC hijack cours d'eau (stdout, stdin, stderr) ou est libstdc ++ tout simplement pas les initialiser parce que je suis la liaison avec GHC?
  • Faites mes importations IFF doivent être « sûr » si elles écrivent stdout?
  • Comment puis-je passer stdout à une fonction C? Dois-je simplement passer directement ou dois-je besoin d'un type C?

Notes complémentaires: Je relie libstdc ++ directement à l'exécutable (à savoir GHC -lstdc ++ ...) que je supposais naïvement serait la bonne façon de le faire. Semble bien fonctionner

Avertissement: Encore assez nouveau pour Haskell, donc pas de bébé pour l'instant; P

Était-ce utile?

La solution

Votre problème ne semble être que libstdc ++ ne sont pas en cours d'initialisation. Je ne suis pas tout à fait sûr pourquoi - -lstdc++ est suffisante sur mon système - mais voir si cela fonctionne dans l'autre sens

.

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

Compiling:

$ 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++
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top