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