【问题标题】:How do I link cabal library and executable?如何链接 cabal 库和可执行文件?
【发布时间】:2021-08-22 09:42:42
【问题描述】:
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

当我运行“cabal build sud”时,一切正常。 但是,当我运行“cabal build suSol”时,出现以下错误:

无法加载模块“Sud.Rdg” ~ │ 它是隐藏包‘SudokuSolver-0.1.0.0’的成员。 ~ │ 也许你需要在你的 .cabal 文件的 build-depends 中添加“SudokuSolver”。 ~ │ 使用 -v(或 ghci 中的 :set -v)查看搜索到的文件列表。

这是我有点不知所措的地方,阴谋集团建议我将此项目本身添加为构建依赖项?如果我这样做,我会得到:

错误:依赖于无法构建的包 SudokuSolver
│ 在 'executable suSol' 节中 |在就地包中 'SudokuSolver-0.1.0.0'

这对我来说很有意义,显然您不能将自己添加为构建依赖项。

但是我在这里错过了什么?

编辑:

如果我将 sud 添加到 build-depends 和“cabal build suSol”中,我会得到:

解决依赖关系...
阴谋集团:无法解决依赖关系:[__0] 尝试: SudokuSolver-0.1.0.0(用户目标)[__1] 未知包:sud (SudokuSolver 的依赖)[__1] 失败(回跳,冲突集: SudokuSolver, sud) 搜索依赖树的其余部分后 详尽地说,这些是我最难以实现的目标: SudokuSolver, sud

【问题讨论】:

  • sud 添加到您的build-dependsexecutable
  • 感谢您的快速响应,如果我这样做,我会收到“未知包”。我认为这是正常的,因为 sud 不是一个包,对吗?我将完整的输出添加到问题中。

标签: haskell cabal


【解决方案1】:

当您向库添加名称时,这意味着它是您包的私有或内部库。似乎 cabal 目前有一个错误,导致出现令人困惑的错误消息,要求您将 SudokuSolver 添加到可执行文件的构建依赖项中,您可以改为添加 SudokuSolver:sud

然而,更常见的做法是让库保持未命名(或将其命名为与包相同的名称),这使其成为主要的公共库。然后库的名称与包的名称相同,因此您应该将SudokuSolver 添加到可执行文件的构建依赖项中。这是长期以来唯一可能的选择,内部库相对较新。这可能也是为什么仍然存在这样一些问题的原因。

我还注意到,您可以像 Willem van Onsem 所说的那样添加 sud,但前提是您使用 cabal-version: 3.0 或更早版本。对于 cabal-version: 3.4,您必须使用 SudokuSolver:sud (package-name:internal-library-name) 表示法。

编辑:我打开了an issue on the cabal GitHub repo

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多