我只是刚开始使用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文件(如果要进行一些小的更改并快速重建,则可以保留它们。这将节省不必要的重新编译时间)。
.o文件确实是目标文件。基本上是准备链接在一起的字节码块。
.hi文件是接口文件。简而言之,它们包含编译类型签名之类的东西以及让 GHC 跨文件边界执行优化的信息。
我个人发现工作目录中的这些文件很烦人,因此我将其添加-outputdir ../tmp到我的ghc调用中。