GHC 生成的 .hi 和 .o 文件是什么(Linux)?
What are the .hi and .o files generated by GHC (on Linux)?
我刚刚开始使用 Haskell 和一般的函数式编程。在编译和 运行 我的第一个 Haskell 程序后,我注意到 GHC(在 Linux 上)从一个 .hs 源文件生成三个单独的文件:一个 .hi 文件,一个 .o 文件,最后是一个可执行文件。这些文件中的每一个的目的是什么?实际上,什么时候实际使用 .hi 和 .o 文件?
根据我对C的一点经验,我认为.o是一个目标文件。搜索 Google 显示 .hi 是 "interface file".
.o
与C的目标文件完全一样; .hi
文件是一个“接口文件”;它包含有关 GHC 需要的 .o
的信息,如果您编译其他模块,以便能够 link 针对该 .o
文件(所述信息不能存储在标准 .o
文件).
你可以说 .hi
文件等同于 C 的头文件(即具有 .h
扩展名),只是这些是由 GHC 从原始 Haskell 生成的来源。
因此,当 GHC 编译其他模块时使用 .hi
,当 link 将所有模块组合在一起生成可执行文件时使用 .o
。
您可以在成功生成可执行文件后安全地删除 .hi
和 .o
文件(或者如果您想进行一些小的更改并快速重建,请保留它们 - 这将节省时间不需要的重新编译)。
.o
文件确实是目标文件。基本上准备好链接在一起的字节码块。
.hi
文件是接口文件。简短的版本是它们包含编译类型签名之类的东西以及让 GHC 跨文件边界执行优化的信息。
我个人觉得我的工作目录中有这些文件很烦人,所以我将 -outputdir ../tmp
添加到我的 ghc
调用中。
我刚刚开始使用 Haskell 和一般的函数式编程。在编译和 运行 我的第一个 Haskell 程序后,我注意到 GHC(在 Linux 上)从一个 .hs 源文件生成三个单独的文件:一个 .hi 文件,一个 .o 文件,最后是一个可执行文件。这些文件中的每一个的目的是什么?实际上,什么时候实际使用 .hi 和 .o 文件?
根据我对C的一点经验,我认为.o是一个目标文件。搜索 Google 显示 .hi 是 "interface file".
.o
与C的目标文件完全一样; .hi
文件是一个“接口文件”;它包含有关 GHC 需要的 .o
的信息,如果您编译其他模块,以便能够 link 针对该 .o
文件(所述信息不能存储在标准 .o
文件).
你可以说 .hi
文件等同于 C 的头文件(即具有 .h
扩展名),只是这些是由 GHC 从原始 Haskell 生成的来源。
因此,当 GHC 编译其他模块时使用 .hi
,当 link 将所有模块组合在一起生成可执行文件时使用 .o
。
您可以在成功生成可执行文件后安全地删除 .hi
和 .o
文件(或者如果您想进行一些小的更改并快速重建,请保留它们 - 这将节省时间不需要的重新编译)。
.o
文件确实是目标文件。基本上准备好链接在一起的字节码块。
.hi
文件是接口文件。简短的版本是它们包含编译类型签名之类的东西以及让 GHC 跨文件边界执行优化的信息。
我个人觉得我的工作目录中有这些文件很烦人,所以我将 -outputdir ../tmp
添加到我的 ghc
调用中。