【问题标题】:No output will be generated because there is no Main module因为没有 Main 模块,所以不会产生输出
【发布时间】:2018-04-04 08:18:43
【问题描述】:

我写了一个简单的模块,叫做Test:

module Test (main) where

main =
  putStrLn "Hello"

但是,当我尝试通过以下命令行编译它时:

ghc Test.hs -o my-program

我收到以下错误:

[1 of 1] Compiling Test             ( Test.hs, Test.o )

<no location info>: error:
    output was redirected with -o, but no output will be generated because there is no Main module.

【问题讨论】:

  • 正如错误所说,没有主模块。你只有一个测试模块。

标签: haskell main


【解决方案1】:

我遇到了同样的问题,但在我的情况下,我是通过在测试源文件中添加一个模块名称引起的,test/Spec.hs:

module Tests where

main :: IO ()
main = hspec $ do ...

解决方案只是删除第一行:

main :: IO ()
main = hspec $ do ...

这也是您使用堆栈创建项目时的默认设置 - 例如,stack new myproject。

【讨论】:

  • 谢谢,这解决了我的问题!你知道究竟是什么原因造成的吗?为什么不应将测试文件定义为模块?
  • 不抱歉,我其实不知道原因,说实话我没有花太多时间处理这件事;)
  • 我在这里发布了一个问题:stackoverflow.com/q/58944736
【解决方案2】:

ghc 将假定 main 位于名为 Main 的模块中(如编译器所说)。

ghc 但是有一个选项-main-is,您可以在其中指定main 函数所在的模块的名称。所以你可以编译:

ghc <b>-main-is Test</b> Test.hs -o my-program

【讨论】:

  • 此答案在您使用stack 并尝试在package.yaml 和main: App.hs 中添加第二个可执行文件的情况下也很有用。 stack build 将失败,并出现与这篇文章标题相同的错误,这让我在这里买了 :)。所以解决方案是在ghc-options 部分添加- -main-is App。只是分享一下,以防有人带着和我一样的情况来到这里。
  • 如果不遵守,在 cabal 文件中有 main-is 部分有什么意义?
  • @SaurabhNanda 有人可能会争辩说main-is 参数。在 cabal 文件中需要一个 .hs 或 .lhs 文件,这是一个实际文件。这并没有说明这个文件可能包含的模块的名称(在这里,人们也可能认为模块名称和文件名/路径在项目中具有很强的关系:例如,可以有一个文件 src/ Foo/Bar.hs 包含一个名为 Foo.Bar 但不是 Foo.Baz 的模块,但这与该标准不同。)因此,从阴谋集团的角度来看,这似乎是文件名,而从 GHC 的角度来看,它必须是模块名称。
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多