如何在Cabal中链接内部库与可执行文件?
问题原因
你使用了Cabal 3.0版本开始支持的命名内部库特性:你在定义library时指定了自定义名称sud,而非项目默认的匿名公共库,所以依赖同项目内部的命名库时,需要遵循特定的格式,你之前的两种依赖写法都不符合规范:
- 直接写包名
SudokuSolver:找不到对应库,因为你没有定义和包名同名的默认公共库 - 直接写内部库名
sud:Cabal会默认检索第三方依赖库,不会识别为同项目内部库
解决方案
有两种可行的修改方式,二选一即可:
方案1:保留命名内部库,修改可执行文件的依赖声明
在executable suSol的build-depends段中,添加SudokuSolver:sud(格式为包名:内部库名)即可,修改后的完整配置如下:
cabal-version: 3.4 name: SudokuSolver version: 0.1.0.0 build-type: Simple library sud build-depends: base , text hs-source-dirs: lib exposed-modules: Sud.Rdg default-language: Haskell2010 executable suSol default-language: Haskell2010 hs-source-dirs: app main-is: Main.hs build-depends: base , optparse-applicative , filepath , text , SudokuSolver:sud
修改后重新执行cabal build suSol即可正常构建。
方案2:将命名内部库改为默认公共库
去掉library声明后的sud,使用项目默认的匿名公共库,此时可执行文件直接依赖包名SudokuSolver即可,修改后的配置如下:
cabal-version: 3.4 name: SudokuSolver version: 0.1.0.0 build-type: Simple library build-depends: base , text hs-source-dirs: lib exposed-modules: Sud.Rdg default-language: Haskell2010 executable suSol default-language: Haskell2010 hs-source-dirs: app main-is: Main.hs build-depends: base , optparse-applicative , filepath , text , SudokuSolver
内容的提问来源于stack exchange,提问作者user3434255
相关产品推荐
相关产品推荐

