GHC可编译的简单Haskell项目,Cabal构建失败求助
解决Cabal构建Haskell项目时找不到本地模块的问题
问题背景
现有Haskell项目的src目录下包含Address.hs、Person.hs和Main.hs,使用ghc src/*.hs可以正常编译链接,但通过cabal init --source-dir=src --main-is=src/Main.hs初始化项目后,执行cabal build时出现模块找不到的错误:
src/Main.hs:1:1: error: Could not find module ‘Person’ Use -v (or `:set -v` in ghci) to see a list of the files searched for. | 1 | import Person | ^^^^^^^^^^^^^ src/Main.hs:2:1: error: Could not find module ‘Address’ Use -v (or `:set -v` in ghci) to see a list of the files searched for. | 2 | import Address | ^^^^^^^^^^^^^^
原因分析
ghc src/*.hs会一次性编译并链接指定目录下的所有Haskell源文件,而Cabal是基于包配置的构建工具——默认情况下,cabal init只会将你指定的Main.hs纳入可执行文件的构建范围,不会自动识别同目录下的其他本地模块,必须显式声明这些模块属于当前包的一部分。
解决步骤
- 打开项目根目录下生成的
.cabal配置文件(文件名通常与项目名一致,比如my-project.cabal) - 找到
executable代码块(块名与项目名相同),示例如下:executable my-project main-is: Main.hs -- other-modules: -- other-extensions: build-depends: base ^>=4.18.1.0 hs-source-dirs: src default-language: Haskell2010 - 取消
-- other-modules:的注释,并添加你的本地模块:other-modules: Address Person - 保存配置文件后,重新执行
cabal build即可正常编译。
补充说明
如果后续项目新增更多本地模块,只需将它们添加到other-modules列表中即可。若项目规模较大,也可以将公共模块拆分到library块中,再让executable依赖这个库,这样项目结构会更清晰。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

