GHC编译时无法找到Sound.Tidal.Context模块,但GHCi可识别,求助
这种情况我之前碰到过,核心原因是直接用ghc编译时,它不会自动读取Cabal管理的包路径配置,而GHCi默认会加载这些配置。下面是几个实用的解决办法:
1. 编译时手动指定tidal包
最简单的临时解决方式,就是在编译命令里加上-package参数明确指定要使用的tidal包:
ghc -package tidal Tidal.hs
这样GHC会直接去查找cabal安装的tidal包模块,而不是只搜索默认的系统路径。
2. 检查并修复tidal包的注册状态
按照错误提示,先运行ghc-pkg check检查包的完整性:
ghc-pkg check
如果输出显示tidal包有文件缺失或注册异常,可以尝试重新注册该包(把下面的路径换成你错误信息里的实际路径):
ghc-pkg register --user /home/chris/.cabal/lib/x86_64-linux-ghc-8.2.2/tidal-0.9.6-HlQOMGZHP8JDJBhFqbDzA/
3. 用Cabal管理编译流程(推荐)
既然你是用Cabal安装的tidal,最好用Cabal来统一管理编译,它会自动处理依赖路径问题。你可以创建一个简单的Cabal配置文件(比如命名为TidalApp.cabal):
name: TidalApp version: 0.1.0.0 build-type: Simple cabal-version: >=1.10 executable TidalApp main-is: Tidal.hs build-depends: base >=4.10 && <4.11, tidal ==0.9.6 default-language: Haskell2010
然后在该文件所在目录运行:
cabal build
编译完成后,可执行文件会生成在dist-newstyle/build目录下。
4. 确保GHC读取Cabal的环境变量
有时候GHC编译时没加载Cabal的环境配置,你可以先加载Cabal的环境脚本,再进行编译:
source ~/.cabal/env ghc Tidal.hs
(Windows系统下对应的命令是call %APPDATA%\cabal\env\cabal-env.bat)
补充:为什么GHCi能找到模块?
GHCi启动时会自动读取~/.ghci配置文件,或者加载Cabal的环境变量,这些配置里已经包含了所有通过cabal install安装的包的路径,所以它能轻松找到Sound.Tidal.Context模块;而直接用ghc编译时,默认只会搜索系统级的库路径和当前目录,不会自动包含Cabal的用户包路径,因此会出现找不到模块的错误。
内容的提问来源于stack exchange,提问作者Chris Stryczynski

