【问题标题】:Producing multiple executables from single project从单个项目生成多个可执行文件
【发布时间】:2012-12-23 16:58:46
【问题描述】:

项目结构如下:

src/FirstExecutable.hs
src/SecondExecutable.hs
my-amazing-project.cabal

以及以下阴谋集团设置:

name:               my-amazing-project
version:            0.1.0.0
build-type:         Simple
cabal-version:      >=1.8

executable first-executable
  hs-source-dirs:   src
  main-is:          FirstExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N
  build-depends:    base == 4.5.*

executable second-executable
  hs-source-dirs:   src
  main-is:          SecondExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N
  build-depends:    base == 4.5.*

运行 cabal install 失败,输出如下:

Installing executable(s) in
/Users/mojojojo/Library/Haskell/ghc-7.4.2/lib/my-amazing-project-0.1.0.0/bin
cabal: dist/build/second-executable/second-executable: does not exist
Failed to install my-amazing-project-0.1.0.0
cabal: Error: some packages failed to install:
my-amazing-project-0.1.0.0 failed during the final install step. The exception
was:
ExitFailure 1

我做错了什么还是阴谋集团的错误?


可执行模块的内容如下:

module FirstExecutable where

main = putStrLn "Running FirstExecutable"

module SecondExecutable where

main = putStrLn "Running SecondExecutable"

【问题讨论】:

  • @Satvik 我刚刚找到了解决方案。发布它
  • 你不应该在可执行文件中使用module ..。或者你可以使用module Main

标签: haskell cabal


【解决方案1】:

cabal 期望可执行文件的模块为Main。您应该跳过模块行或使用module Main where

好吧,这就是可能的原因。当您实际编译程序时,如果模块不是Main,则不会生成haskell 程序的可执行文件。运行可执行文件时使用Main 模块的main 函数。 ghc 可能的解决方法是-main-is 标志。所以你可以有类似的东西

name:               my-amazing-project
version:            0.1.0.0
build-type:         Simple
cabal-version:      >=1.8

executable first-executable
  hs-source-dirs:   src
  main-is:          FirstExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N -main-is FirstExecutable
  build-depends:    base == 4.5.*

executable second-executable
  hs-source-dirs:   src
  main-is:          SecondExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N -main-is SecondExecutable
  build-depends:    base == 4.5.*

【讨论】:

  • 是的,这正是我花了几个小时在谷歌上搜索和殴打自己后偶然发现的。坦率地说,我对他们为什么选择如此令人困惑的行为感到沮丧。一个糟糕的设计决策 IMO
  • @NikitaVolkov 这种行为是由language standard 强制执行的——“Haskell 程序是模块的集合,按照惯例,其中一个必须称为 Main 并且必须导出值 main。”。
  • @MikhailGlushenkov 谢谢。因此,Cabal 家伙通过允许用户声明不同名称的“主要”模块来违反标准。类似的事情应该在文档中大胆地注明,但there's not a word about this nor the actual issue in it(如果有访问权限的人正在阅读此评论,请注意)。
  • @NikitaVolkov -main-is 是 GHC 扩展。它被描述为in the GHC documentation
  • Cabal 的 main-is 和 GHC 的 -main-is 做不同的事情。 Cabal 的main-is 只允许您定义主模块所在的文件名,但模块名 仍然必须是Main(即文件内的模块声明) . GHC 的-main-is 允许模块名称或main 函数名称为其他名称。
猜你喜欢
  • 2021-04-16
  • 2018-11-14
  • 1970-01-01
  • 2010-09-11
  • 2012-08-17
相关资源
最近更新 更多