gpt4 book ai didi

haskell - cabal FFI 依赖

转载 作者:行者123 更新时间:2023-12-02 23:14:08 26 4
gpt4 key购买 nike

我正在 Windows 中制作一个小型 Haskell 游戏,我想在用户每次按下按键时做出响应。因为 getChar behaves strangely在 Windows 上,我使用 FFI 访问 conio.h 中的 getch,如所述 here 。相关代码为:

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

当我在 ghci 中运行它或使用 ghc 编译它时,效果很好。我还想尝试用它制作一个阴谋包,因此从this延伸问题,我在我的 cabal 文件中包含以下内容:

...
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 文件中的库?

最佳答案

首先,C 头文件和库之间并不总是存在一对一的映射。在这种情况下,conio.h 中声明的函数可以在各种运行时库中找到,例如 crtdll(已弃用)或 msvcrt(首选) ,我猜)。

使用 Windows 上的 Haskell 平台,Cabal 将在 .\mingw\lib(在您的 Haskell Platform 目录下)中查找这些库:如果您要求 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
!

关于haskell - cabal FFI 依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13544642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com