GHC 编译为 .o 和 .hi 但没有可执行文件
GHC compiles to .o and .hi but no executable
我一直在处理一个我一直在编译的小文件,并且 运行我正在编译它。我的目录包含 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 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 明白它只是一个将被导入到另一个文件中的模块,所以它不会创建一个可执行文件。
我一直在处理一个我一直在编译的小文件,并且 运行我正在编译它。我的目录包含 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 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 明白它只是一个将被导入到另一个文件中的模块,所以它不会创建一个可执行文件。