繁体   English   中英

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

[英]GHC compiles to .o and .hi but no executable

我一直在处理一个小文件,我一直在编译和运行 go。 我的目录包含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文件,但没有可执行文件。 output 是:

[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的评论和 Willem Van Onsem的回答。)所以编译

ghc -main-is LogAnalysis LogAnalysis.hs

给出 output

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

所以 GHC 已经链接了可执行的LogAnalysis ,这是期望的结果。

有一种更简单的方法可以修复它,删除第二行:

module LogAnalysis where

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM