执行cabal build构建Haskell项目时csound-expression-dynamic编译报错如何解决
问题原因
你遇到的报错是因为使用的GHC 9.0.1版本和依赖的csound-expression-dynamic-0.3.8库不兼容:GHC 9.0版本对Data.Functor.Classes.Eq1类的实现做了不向后兼容的修改,而csound-expression-dynamic-0.3.8是适配GHC 8.x系列的旧版本,没有提供对应的实例实现,所以编译失败。
解决方法
按优先级从高到低排列:
方法1:切换到兼容的GHC版本(最稳定,推荐新手使用)
csound相关生态对GHC 8.10.x版本的兼容性最好,直接切换GHC版本即可解决问题:
- 如果你用GHCup管理Haskell工具链,依次执行以下命令:
ghcup install ghc 8.10.7 ghcup set ghc 8.10.7 - 切换完成后删除项目根目录下的
dist-newstyle文件夹,再重新执行cabal build即可。
方法2:升级依赖库版本(不想换GHC可以用)
新版的csound相关库已经适配了高版本GHC,你可以在项目根目录新建/修改cabal.project文件,添加以下版本约束:
constraints: csound-expression-dynamic >= 0.4, csound-expression-typed >= 0.3, csound-expression-opcodes >= 0.0.6, csound-expression >= 5.4, csound-sampler >= 0.0.11, csound-catalog >= 0.7.5
添加完成后依次执行cabal clean、cabal build即可。
方法3:临时添加编译选项(应急用,不推荐长期使用)
如果因为项目要求不能换GHC也不能升依赖,可以给对应的库添加临时编译参数绕过报错,在cabal.project中添加以下配置:
package csound-expression-dynamic-0.3.8 ghc-options: -fallow-unsupported-instance-syntax -XDeriveEq1
配置后重新执行构建即可。
内容的提问来源于stack exchange,提问作者Abhay Solanki
相关产品推荐
相关产品推荐

