如何在Linux(WSL Debian)下不使用Cabal配置Haskell的SDL2?
问题描述
我是Haskell新手,使用WSL Debian系统,已安装官方ghc包。想要配置SDL2以实现Haskell的SDL2编译,首次尝试编译时出现如下错误:
$ cat sdl2_test.hs import SDL main :: IO () main = do ... $ ghc sdl2_test.hs -lsdl2 [1 of 2] Compiling Main ( sdl2_test.hs, sdl2_test.o ) sdl2_test.hs:1:1: error: Could not find module ‘SDL’ Use -v (or `:set -v` in ghci) to see a list of the files searched for. | 1 | import SDL | ^^^^^^^^^^
编译包含SDL2的C程序可正常运行,但Haskell中无法实现。我了解到需导入特定SDL2模块,但该模块依赖Cabal。请问如何无需使用Cabal编译带SDL2的Haskell文件?
解决方法
不用Cabal的话,你得手动编译Haskell的SDL2绑定库并把它安装到GHC能识别的系统路径里,具体步骤如下:
补全依赖工具与开发库
先确保安装了SDL2开发包和必要的编译工具(尽管你的C程序能编译,但Haskell绑定需要完整的头文件支持):sudo apt install libsdl2-dev ghc make git拉取Haskell SDL2绑定源码
克隆官方维护的Haskell SDL2绑定仓库:git clone https://github.com/haskell-game/sdl2.git cd sdl2手动编译并安装库文件
跳过Cabal,直接用GHC完成编译与安装:- 编译所有模块文件:
ghc -c -O2 -package base -package bytestring -package text -package vector src/SDL/*.hs src/SDL/*/*.hs - 将编译生成的
.o文件打包成静态库:ar rcs libHSsdl2.a *.o - 创建库目录并复制文件(注意替换版本号为你克隆仓库中
cabal文件的实际版本,比如2.5.3.0):sudo mkdir -p $(ghc --print-libdir)/sdl2-2.5.3.0/ sudo cp libHSsdl2.a $(ghc --print-libdir)/sdl2-2.5.3.0/ sudo cp -r src/SDL $(ghc --print-libdir)/../include/ sudo cp src/*.hi $(ghc --print-libdir)/sdl2-2.5.3.0/ - 将该库注册到GHC的系统包数据库:
sudo ghc-pkg register --force sdl2.cabal
- 编译所有模块文件:
编译你的测试程序
完成上述步骤后,就可以直接用GHC编译你的SDL2 Haskell程序了:ghc sdl2_test.hs -lsdl2
如果只是临时测试,也可以通过ghc-pkg临时添加库路径,但上面的方法是一次性安装到系统,后续编译无需重复配置。
内容的提问来源于stack exchange,提问作者Priff13
相关产品推荐
相关产品推荐

