You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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完成编译与安装:

    1. 编译所有模块文件:
      ghc -c -O2 -package base -package bytestring -package text -package vector src/SDL/*.hs src/SDL/*/*.hs
      
    2. 将编译生成的.o文件打包成静态库:
      ar rcs libHSsdl2.a *.o
      
    3. 创建库目录并复制文件(注意替换版本号为你克隆仓库中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/
      
    4. 将该库注册到GHC的系统包数据库:
      sudo ghc-pkg register --force sdl2.cabal
      
  • 编译你的测试程序
    完成上述步骤后,就可以直接用GHC编译你的SDL2 Haskell程序了:

    ghc sdl2_test.hs -lsdl2
    

如果只是临时测试,也可以通过ghc-pkg临时添加库路径,但上面的方法是一次性安装到系统,后续编译无需重复配置。


内容的提问来源于stack exchange,提问作者Priff13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:33:19