15

私はWindowsで小さなHaskellゲームを作成しています。このゲームでは、ユーザーがキーを押すたびに応答したいと思います。getChar Windowsでの動作がおかしいので、ここで説明するようgetchに、 FFIを使用してにアクセスします。関連するコードは次のとおりです。conio.h

foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt

これは、ghciで実行するか、ghcでコンパイルすると、正常に機能します。また、それからカバールパッケージを作成してみたいので、この質問から拡張して、カバールファイルに次の情報を含めます。

...
executable noughts
  Includes:          conio.h
  Extra-libraries    conio
...

しかし、私が走るcabal configureと、それは私に言います:

cabal: Missing dependency on a foreign library:
* Missing C library: conio

私のhaskellプラットフォームディレクトリで...\Haskell Platform\2012.4.0.0\mingwは、ディレクトリのconio.h下にファイルがありますが、オブジェクトコードを提供するinclude他のファイルはありません。conio

私はこれを正しい方法で行っていますか?もしそうなら、どのライブラリを私のcabalファイルに含めるかをどのように見つけることができますか?

4

1 に答える 1

7

まず、Cヘッダーファイルとライブラリの間には常に1対1のマッピングがあるとは限りません。この場合、で宣言された関数は、(非推奨)や(推奨)conio.hなどのさまざまなランタイムライブラリにあります。crtdllmsvcrt

Windows上のHaskellプラットフォームでは、Cabalは.\mingw\lib(Haskellプラットフォームディレクトリの下の)これらのライブラリを検索します。要求するとmsvcrt、を検索し.\mingw\lib\libmsvcrt.aます。この特定のライブラリは、Haskellプラットフォームにすでに同梱されているはずです。(ファイルで他のディレクトリをポイントするlib*.a場合は、Cabalの--extra-lib-dirsオプションを使用できます。)

この小さな例は次のとおりです。これはMain.hs

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types
foreign import ccall unsafe "conio.h _putch" c_putch :: CInt -> IO ()

main :: IO ()
main = do
    c_putch . toEnum . fromEnum $ '!'
    c_putch . toEnum . fromEnum $ '\n'

そしてこれはsomething-awesome.cabal

name:                something-awesome
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.8

executable yay
  main-is:             Main.hs
  build-depends:       base ==4.5.*

  includes:            conio.h
  extra-libraries:     msvcrt

これは正常に機能するはずです。

c:\tmp\something-awesome> dir /B
Main.hs
something-awesome.cabal

c:\tmp\something-awesome> cabal configure
Resolving dependencies...
Configuring something-awesome-0.1.0.0...

c:\tmp\something-awesome> cabal build
Building something-awesome-0.1.0.0...
Preprocessing executable 'yay' for something-awesome-0.1.0.0...
[1 of 1] Compiling Main             ( Main.hs, dist\build\yay\yay-tmp\Main.o )
Linking dist\build\yay\yay.exe ...

c:\tmp\something-awesome> dist\build\yay\yay.exe
!
于 2012-11-25T11:13:29.410 に答える