Haskell GHC编译为.o和.hi,但没有可执行文件

Haskell GHC编译为.o和.hi,但没有可执行文件,haskell,ghc,Haskell,Ghc,我一直在编写一个小文件,我一直在编译和运行它。我的目录包含Log.hs和LogAnalysis.hs LogAnalysis.hs如下所示: {-# OPTIONS_GHC -Wall #-} module LogAnalysis where import Log parseMessage :: String -> LogMessage --some code... main :: IO () main = do putStrLn (show (parseMessage (&

我一直在编写一个小文件,我一直在编译和运行它。我的目录包含
Log.hs
LogAnalysis.hs

LogAnalysis.hs
如下所示:

{-# OPTIONS_GHC -Wall #-}
module LogAnalysis where

import Log

parseMessage :: String -> LogMessage
--some code...

main :: IO ()
main = do
    putStrLn (show (parseMessage ("Some log message text")))
当我用GHC编译
LogAnalysis.hs
时,我得到了一个可执行文件,以及一些其他二进制文件:

$ ll
Log.hi
Log.hs
Log.o
LogAnalysis     <-- this is the executable which has disappeared
LogAnalysis.hi
LogAnalysis.hs
LogAnalysis.o
我甚至不知道我改变了什么,但那并不是什么大事。知道是什么触发了这一切吗?有没有办法强制GHC生成一个可执行文件


规范:GHC 8.8.3,macOS 10.15.5

由于我将文件声明为未命名为
Main的模块,默认情况下GHC不会创建可执行文件。为了将这个模块编译成可执行文件,我们可以使用GHC的
main is
标志。(感谢评论和Willem Van Onsem对此的回答)因此,请使用

ghc -main-is LogAnalysis LogAnalysis.hs
给出输出

[2 of 2] Compiling LogAnalysis      ( LogAnalysis.hs, LogAnalysis.o )
Linking LogAnalysis ...

因此GHC链接了可执行的日志分析,这是期望的结果。

有一个更简单的方法来修复它,删除第二行:

module LogAnalysis where

我相信,当您将其定义为模块时,ghc理解它只是一个模块,将导入另一个文件中,因此它不会创建可执行文件。

但是有一个可执行文件?请包括您正在使用的命令行。另外,
LogAnalysis.hs
模块的名称是什么?GHC的旧版本需要一个
-make
开关:
GHC-make LogAnalysis.hs
。在较新版本中,如果提供的文件是
Main
模块,则这将自动执行。由于默认模块标题将模块命名为
Main
,我怀疑您的更改包括添加模块标题,以及将模块命名为
Main
以外的内容。神奇的侦探作品@Krantz。谢谢,就这样!解决方案是,由于我的文件开始了导入日志的模块日志分析,要用ghc编译-main是LogAnalysis LogAnalysis.hs
@JoshFriedlander,您应该添加它作为答案。
module LogAnalysis where