Reputation: 4435
I'm developing a small haskell program that uses an external static library I've developed in C++. It accesses the lib through ghc's FFI (foreign function interface). Inside this library I would like to do some output to the console. However, it looks to me like the c++ side of things does not have a correct handle to stdout because output does not appear on the console. So then, my questions are:
Additional notes: I'm linking libstdc++ directly to the executable (i.e. ghc -lstdc++ ...) which I naively assumed would be the correct way of doing this. Seems to work well
Disclaimer: Still pretty new to Haskell, so baby steps for now ;P
Upvotes: 5
Views: 771
Reputation: 204718
Your problem does appear to be that libstdc++ is not being initialized. I'm not entirely sure why — -lstdc++
is sufficient on my system — but see if it works the other way around.
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++
Upvotes: 4