を標準出力に出力/stderr/stdinトの背後にウのFFI
質問
の開発をしている小さなウるプログラムを使用して外部の静的ライブラリの開発したC++.でアクセスのlibをghcのFFI(foreign function interface)という方式です。この図書館の思い出です。ただし、 見 私のようにc++いないので正しいハンドルを標準出力に出力で出力が表示されないのです。そのため、私の質問:
- なghcこれらのハイジャックの流れ(stdout、stdin、およびstderr)または特定のラスタ化ライブラリを++な初期化しないリンクghc?
- 私FFIの輸入が必要"安全な書き込みを標準出力に出力?
- どのようにしていただくために標準出力に出力C機能しているのでしょうか。だけで直接または必要としないシステム構築も可能Cタイプ?
その他の注意点 私は特定のラスタ化ライブラリをリンク++を直接実行わghc-lstdc++...)のnaively想の修正方法を行っています。うもの
免責事項: も新しいウので、赤ちゃんの手順今P
解決
あなたの問題は、初期化されていないことにlibstdc ++ように見えるん。 -lstdc++
が私のシステムで十分です - - 私はなぜ全くわからないんだけど、それは他の方法で回避動作するかどうかを確認
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;
}
コンパイルます:
$ 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++
所属していません StackOverflow