You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:18:02