【发布时间】:2012-11-24 19:15:45
【问题描述】:
我正在 Windows 中制作一个小型 Haskell 游戏,我想在用户每次按键时做出响应。因为 getChar behaves strangely 在 Windows 上,我使用 FFI 来访问 conio.h 中的 getch,如 here 所述。相关代码为:
foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt
当我在 ghci 中运行它或使用 ghc 编译它时,这很好用。我还想尝试用它制作一个 cabal 包,因此从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下include目录下有一个conio.h文件,但没有其他conio文件提供目标代码。
我这样做的方式是否正确,如果是,我如何找出要包含在我的 cabal 文件中的库?
【问题讨论】:
-
提供 conio 函数的库有很多。你试过
Extra-Libraries: crtdll或Extra-Libraries: msvcrt吗?顺便说一句,根据 MSDN,您应该使用_getch而不是getch,但头文件可能会为您做到这一点。 -
请注意,这只会影响 Windows 中的 ghc/ghci,并且解决方案代码在 WinHugs 中尤其不起作用,因此您需要它仅在特定于 Windows/ghc 时使用它进行编译。跨度>
-
@Tinctorius 我刚刚尝试了
Extra-libraries: msvcrt和Extra-libraries: crtdll单独和组合。它没有改变cabal build的输出。我在我的 Visual Studio 安装下找到了msvcrt.lib和crtdll.c,并将它们复制到我的文件夹中,但它没有改变任何东西。 -
@Boris:如果你说
Extra-Libraries: NAME,Cabal 应该在寻找...\Haskell Platform\2012.4.0.0\mingw\lib\libNAME.a。我在那个目录中有libcrtdll.a,所以对crtdll的依赖对我来说很好。您是否尝试将--extra-lib-dirs参数提供给cabal,指向该目录? -
@Tinctorius:我的 cabal 文件中现在有
Extra-libraries: crtdll。我在...\Haskell Platform\2012.4.0.0\mingw\lib下有文件libcrtdll.a,并且我已经使用extra-lib-dirs="(Path to lib dir)"标志配置了cabal。我现在得到错误:parse error on input 'import,所以它有所不同。顺便说一句,我认为 cabal 默认会包含lib文件夹?