我一般只是从Haskell和函数式编程入门。编译并运行我的第一个Haskell程序后,我注意到GHC(在Linux上)从单个.hs源文件生成三个单独的文件:.hi文件,.o文件以及最后一个可执行文件。这些文件的目的是什么?实际上,什么时候真正使用.hi和.o文件?
根据我在C方面的小经验,我认为.o是目标文件。搜索Google表示.hi是“接口文件”。
答案 0 :(得分:8)
.o与C的目标文件完全相同; .hi文件是“接口文件”;它包含有关GHC的信息,如果您编译其他模块,则该G.O才能链接到该.o文件(所述信息不能存储在标准.o文件中)。
您可以说.hi文件与C的头文件等效(具有.h扩展名),只有GHC是从原始Haskell源文件生成的。
因此,GHC编译其他模块时使用.hi,将所有模块链接在一起以生成可执行文件时使用.o。
成功生成可执行文件后,您可以安全地删除.hi和.o文件(如果要进行一些小的更改并快速重建,可以保留它们。这样可以节省不必要的重新编译时间)。
答案 1 :(得分:2)
.o
文件确实是目标文件。基本上字节代码块准备好链接在一起。
.hi
文件是界面文件。简短的版本是它们拥有类似编译类型签名之类的信息以及使GHC可以跨文件边界执行优化的信息。
我个人发现这些文件在我的工作目录中非常烦人,以至于我在-outputdir ../tmp
调用中添加了ghc
。