まず、Windows 10 64bitとHaskell Platform 8.0.1を使用するように指定します。WindowsのGHCIとのHaskell外部関数インタフェース
次のコードを使用して、WindowsでHaskellのFFIを使用しようとしています。
import Control.Monad
import Data.Char
import Foreign.C
getCh :: IO Char
getCh = liftM (chr . fromEnum) c_getch
foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt
main :: IO()
main = getCh >>= \x -> print x
はこの後、私はGHC
> ghc Examples.hs
[1 of 1] Compiling Main (Examples.hs, Examples.o)
Linking Examples.exe ...
とよくこれをコンパイルすることができますし、それは完全に実行されます。
> Examples.exe
'1'
(私はそれを実行した後に1を入力すると)
しかし、問題は、GHCiので発生します。 ghciにロードすると、これらのメッセージが表示されます。
> ghci Examples.hs
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main (Examples.hs, interpreted)
Ok, modules loaded: Main.
*Main> main
ByteCodeLink: can't find label
During interactive linking, GHCi couldn't find the following symbol:
getch
This may be due to you not asking GHCi to load extra object files,
archives or DLLs needed by your current session. Restart GHCi, specifying
the missing library using the -L/path/to/object/dir and -lmissinglibname
flags, or simply by naming the relevant files on the GHCi command line.
Alternatively, this link failure might indicate a bug in GHCi.
If you suspect the latter, please send a bug report to:
[email protected]
*Main>
は、私はそのようなconio.h
を使用する必要がありますが、結果は悲観的に同じである「-lmsvcrt
」として、「不足しているライブラリー」をロードしよう。
> ghci -lmsvcrt Examples.hs
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main (Examples.hs, interpreted)
Ok, modules loaded: Main.
*Main> main
ByteCodeLink: can't find label
During interactive linking, GHCi couldn't find the following symbol:
getch
This may be due to you not asking GHCi to load extra object files,
archives or DLLs needed by your current session. Restart GHCi, specifying
the missing library using the -L/path/to/object/dir and -lmissinglibname
flags, or simply by naming the relevant files on the GHCi command line.
Alternatively, this link failure might indicate a bug in GHCi.
If you suspect the latter, please send a bug report to:
[email protected]
*Main>
私は間違ったライブラリをロードしようとすると、GHCiのは、そのことについて、エラーを出力しますので、GHCiのは、おそらく、ライブラリをロードします。
私はghci Examples.hs -fobject-code
、ghci -lmsvcrt Examples.hs -fobject-code
を使用して、さらに
ghci Examples.hs "-luser32" "-lgdi32" "-lwinmm" "-ladvapi32" "-lshell32"
"-lshfolder" "-lwsock32" "-luser32" "-lshell32" "-lmsvcrt" "-lmingw32"
"-lmingwex" "-luser32" "-lmingw32" "-lmingwex" "-lm" "-lwsock32" "-lgdi32" "-lwinmm"
ghc Examples.hs -v5
で発見されたどのようないくつかの他のものを試してみてください。
悲しいことに、何も私のmain
のために働いていない、と私はこれのために他の方法を見つけることができません。
P.S. WindowsでhSetBufferingを使用する方法を知っている人はいますか(それは8年前にghc ticket #2189に投稿されていましたが修正されていませんか?)
になります。指定しなくても、これはうまく 'stdio.hのgetchar'を使用して、Linuxで動作します。1.を2.あなたのアプローチはほぼ正しいと思われます。 – crockeea
@Eric Linuxの場合、hSetBuffering関数はうまく動作し、その関数を使うことで_Bufferless Input_を作ることができるので、この場合はFFIの必要はありません。しかし、このアプローチはWindowsではうまくいきませんでした。 –
私は 'getChar'とリンクしようとする主な質問のみを指していました。私はバッファリングの問題についてお手伝いできません。 – crockeea