GHC(在Linux上)生成的.hi和.o文件是什么?

jmp*_*unn 3 haskell ghc

我只是刚开始使用Haskell和函数式编程。编译并运行我的第一个Haskell程序后,我注意到(在Linux上)GHC从单个.hs源文件生成三个单独的文件:.hi文件,.o文件以及最后一个可执行文件。这些文件的目的是什么?实际上,何时实际使用.hi和.o文件?

根据我在C语言方面的小经验,我认为.o是一个目标文件。搜索Google表示.hi是“接口文件”。

typ*_*ern 10

.o与C的目标文件完全相同;.hi文件是“接口文件”;它包含有关GHC的信息,如果您编译其他模块,则需要GHC才能链接到该.o文件(上述信息无法存储在标准.o文件中)。

您可以说.hi文件等同于C的头文件(即扩展名为.h),只有GHC是从原始Haskell源代码生成的。

因此,在GHC编译其他模块时使用.hi,在将所有模块链接在一起以生成可执行文件时使用.o。

成功生成可执行文件后,您可以安全地删除.hi和.o文件(如果要进行一些小的更改并快速重建,则可以保留它们。这将节省不必要的重新编译时间)。

  • C编译器不知道GHC如何将Haskell代码表示为可执行代码的细节,因此,基本上,不-您想要使用GHC的FFI接口明确声明如何使Haskell和C交互。 (2认同)
  • 更准确地说:默认情况下,GHC在`.o`中生成的代码不准备从C调用。如果您使用`foreign export`指令(请参阅GHC手册),则`.o`文件将包含可以从C调用的函数。您始终可以将GHC产生的.o文件*链接*到C程序中,无论它们中有什么,目标文件都是目标文件。问题是C程序是否可以*使用*该目标文件中的任何代码。 (2认同)

Joh*_*ler 5

.o文件确实是目标文件。基本上是准备链接在一起的字节码块。

.hi文件是接口文件。简而言之,它们包含编译类型签名之类的东西以及让 GHC 跨文件边界执行优化的信息。


我个人发现工作目录中的这些文件很烦人,因此我将其添加-outputdir ../tmp到我的ghc调用中。