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

Jos*_*der 4 haskell ghc

我一直在处理一个小文件,我一直在编译和运行它。我的目录包含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")))
Run Code Online (Sandbox Code Playgroud)

当我LogAnalysis.hs用 GHC编译时,我得到了一个可执行文件,以及其他一些二进制文件:

$ ll
Log.hi
Log.hs
Log.o
LogAnalysis     <-- this is the executable which has disappeared
LogAnalysis.hi
LogAnalysis.hs
LogAnalysis.o
Run Code Online (Sandbox Code Playgroud)

我做了一些小改动,现在当我运行时,ghc LogAnalysis.hs我只得到.hi.o文件,但没有可执行文件。输出是:

[1 of 2] Compiling Log              ( Log.hs, Log.o )
[2 of 2] Compiling LogAnalysis      ( LogAnalysis.hs, LogAnalysis.o )
Run Code Online (Sandbox Code Playgroud)

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

规格:GHC 8.8.3,macOS 10.15.5

Jos*_*der 8

由于我将文件声明为未命名的模块Main,因此默认情况下 GHC 不会创建可执行文件。为了将此模块编译为可执行文件,我们可以使用 GHC 的main-is标志。(感谢克兰茨评价和威廉·Onsem的答案在这里的这个。)因此,与编译

ghc -main-is LogAnalysis LogAnalysis.hs
Run Code Online (Sandbox Code Playgroud)

给出输出

[2 of 2] Compiling LogAnalysis      ( LogAnalysis.hs, LogAnalysis.o )
Linking LogAnalysis ...
Run Code Online (Sandbox Code Playgroud)

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