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

GHC compiles to .o and .hi but no executable

我一直在处理一个我一直在编译的小文件,并且 运行我正在编译它。我的目录包含 Log.hsLogAnalysis.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 LogAnalysis.hs 时,我只得到 .hi.o 文件,但没有可执行文件。输出为:

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

我什至不确定我更改了什么,但没什么大不了的。知道是什么触发了这个吗?有什么方法可以强制 GHC 生成可执行文件吗?

规格:GHC 8.8.3,macOS 10.15.5

由于我将文件声明为未命名的模块 Main,默认情况下 GHC 不会创建可执行文件。为了将这个模块编译成可执行文件,我们可以使用 GHC 的 main-is 标志。 (感谢 Krantz in the comments and Willem Van Onsem's answer 。)所以用

编译
ghc -main-is LogAnalysis LogAnalysis.hs

给出输出

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

因此 GHC 已链接可执行文件 LogAnalysis,这是所需的结果。

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

module LogAnalysis where

我相信当你将它定义为一个模块时,ghc 明白它只是一个将被导入到另一个文件中的模块,所以它不会创建一个可执行文件。