40

通过ghc --make foo.hsGHC 编译 haskell 源文件时,总是会留下各种中间文件,而不是foo.exe. 这些是foo.hifoo.o

我经常不得不删除 .hi 和 .o 文件以避免弄乱文件夹。

GHC 是否有命令行选项不留下其中间文件?(当在#haskell 上被问到时,我得到的最佳答案是ghc --make foo.hs && rm foo.hi foo.o.

4

6 回答 6

38

我已经浏览了 GHC 文档,似乎没有内置的方法可以自动删除临时文件——毕竟,GHC 需要这些中间文件来构建最终的可执行文件,以及它们的存在速度当 GHC 知道它不需要重新编译模块时,可以进行整体编译。

但是,您可能会发现设置-outputdir选项会对您有所帮助;这会将您的所有目标文件 ( .o)、接口文件 ( .hi) 和 FFI 存根文件放在指定的目录中。它仍然是“混乱的”,但至少它不再在您的工作目录中了。

于 2009-09-11T16:31:40.963 回答
18

GHC 现在有选项 no-keep-hi-filesno-keep-o-files. 请参阅此处了解更多信息。

于 2018-06-28T21:03:10.310 回答
16

我通常的工作流程是直接使用 cabal 而不是 ghc。这会将 outputdir 选项设置到适当的构建文件夹中,并且可以为您执行诸如构建黑线鳕文档之类的事情。您只需要为您的项目定义 .cabal 文件,然后说 cabal install 或 cabal build 而不是直接运行 ghc。因为如果你想分享你在 hackage 上的工作,你最终需要遵循这个过程,这是一个很好的实践,它也有助于管理包依赖关系。

于 2009-09-11T17:13:14.903 回答
6

我认为,您可以将 -hidir 设置为 /dev/null,然后将它们发送到那里。此外, -fno-code 选项通常会关闭大量输出。您可能只想使用 Cabal。

于 2009-09-12T09:05:22.987 回答
3

原来使用 -hidir/-odir/-outputdir 不好;/dev/null 是一个文件,而不是一个目录。见http://www.haskell.org/pipermail/xmonad/2010-May/010182.html

于 2010-05-13T15:42:20.750 回答
1

2 美分改善工作流程:
我们可以将以下别名放入.bashrc(或类似的)配置文件中:

alias hsc='_hsc(){ ghc -no-keep-hi-files -no-keep-o-files "$@";}; _hsc'

然后打电话

$ hsc compose.hs 
[1 of 1] Compiling Main             ( compose.hs, compose.o )
Linking compose ...
$ ls
compose  compose.hs
于 2021-09-13T17:12:54.087 回答