为Haskell Stack项目添加gloss依赖后执行stack build报错无法加载Graphics.Gloss模块
报错成因拆解
你遇到的报错是三个配置偏差叠加导致的,逐一对应即可解决:
- 手动修改派生cabal文件无效:你的项目是Stack默认Hpack模板生成的,根目录下的
package.yaml是依赖配置的唯一源头,project39.cabal是每次构建时自动从package.yaml生成的自动派生文件,手动写入的内容会被构建流程自动覆盖,根本不会实际生效。 - 依赖加错了组件层级:你编辑的cabal片段是可执行程序
project39-exe的配置段,但实际引入Graphics.Gloss模块的src/Lib.hs属于项目的库组件(即project39本身),库组件的依赖列表里没有声明gloss,就会触发“隐藏包、模块不可见”的典型报错。 - Stack依赖源配置未生效:你当前的
stack.yaml中所有extra-deps配置行都被注释标记,Stack无法从本地解析路径识别到gloss的合法依赖版本。
修复步骤
1. 配置stack.yaml的合法依赖源
取消extra-deps段落的注释,写入gloss的版本声明,最终效果参考:
extra-deps: - gloss-1.13.2.1
注:如果使用当前主流的LTS Stackage快照,
gloss本身已经在默认快照范围内,不需要额外添加其他传递依赖即可被解析。
2. 从配置源头package.yaml声明依赖
直接编辑根目录的package.yaml文件,不要手动修改自动生成的.cabal文件:
- 找到库组件的配置段(对应
source-dirs: src的library部分,也就是会编译src/Lib.hs的组件),在其dependencies列表中加入gloss。 - 可执行组件的依赖只需要声明对项目本身库的依赖即可,不需要重复添加
gloss。
参考调整后的package.yaml核心结构:
# 库组件(编译src目录下的Lib.hs) library: source-dirs: src dependencies: - base >= 4.7 && < 5 - gloss # 模块引入在这里需要加依赖 # 可执行组件(编译app目录下的Main.hs) executables: project39-exe: main: Main.hs source-dirs: app ghc-options: - -threaded - -rtsopts - -with-rtsopts=-N dependencies: - project39
3. 触发构建完成编译
配置完成后直接执行stack build即可,构建流程会自动根据package.yaml重新生成正确的.cabal文件、下载依赖、完成编译。如果出现系统层面的OpenGL/GLFW库缺失报错,按照对应平台的包管理提示安装系统依赖即可,和Haskell层的配置无关。
内容的提问来源于stack exchange,提问作者Antowan
相关产品推荐
相关产品推荐

