首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有理由保留.cmo或仅保留.cma?

是否有理由保留.cmo或仅保留.cma?
EN

Stack Overflow用户
提问于 2011-12-26 01:17:30
回答 2查看 1.3K关注 0票数 4

比方说,我有为library.c提供包装的mylibrary.ml,我想进行字节码编译,并将mylibrary.ml作为库提供给其他ocaml代码。将其编译成字节码(我在这里不考虑将ocaml编译成本机代码)会产生许多文件,我想知道是否有任何理由保留所有这些文件?或者将它们全部提供给库的其他用户?

我(到目前为止)知道我需要字节码库对象mylibrary.cma,这样我就可以在ocaml toplevel中使用mylibrary

代码语言:javascript
复制
ocaml mylibrary.cma

或者我可以

代码语言:javascript
复制
#load "mylibrary.cma";;

从ocaml脚本。然后还需要编译的接口mylibrary.cmidllmylibrary.so (包含代码的C部分)才能运行上面的代码。未编译的接口定义文件mylibrary.mli很容易保存,以便进行文档记录。

但是,如果我有mylibrary.cma文件,还有什么理由还要保留mylibrary.cmo文件吗?在什么样的情况下,有人也想拥有它呢?

编辑:我的意思是,我需要在makefile中构造.cmo,然后用它来构造.cma,但我想在这之后删除.cmo,以保持目录的边际整洁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 23:35:39

因此,很明显,不同文件的目的是(仅限于字节码编译器):

mylibrary.mli -人类可读的接口定义(不是严格需要的,编译器只需要.cmi)

mylibrary.cmi编译接口,编译调用mylibrary的代码时需要

library.o -C目标文件

.o组成的dlllibrary.so共享库对象

dlllibrary.a -由.o组成的静态库对象

mylibrary.cmo -从mylibrary.ml编译的字节码对象

mylibrary.cma -字节码库

然后,当从顶层加载mylibrary时,需要mylibrary.cma (带有mylibrary.cmidlllibrary.so):

#load "mylibrary.cma";;

可以编译一个动态链接到mylibrary.cma的字节码程序(还需要mylibrary.cmidlllibrary.so ):

ocamlc mylibrary.cma <program>.ml

动态链接字节码对象,而不是字节码库(需要的文件:mylibrary.cmomylibrary.cmidlllibrary.so):

ocamlc dlllibrary.so mylibrary.cmo <program>.ml

(注意:假设dlllibrary.so在当前目录中,则使用:ocamlrun -I . <program>运行字节码。)

与对象静态链接(所需文件:mylibrary.cmomylibrary.cmi liblibrary.a)

ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

与库对象静态链接(所需文件:mylibrary.cmamylibrary.cmiliblibrary.a)

ocamlc -custom -I . mylibrary.cma <program>.ml

因此,根据将来如何使用库,需要不同的文件。除了只有人类读者需要.mli,而不需要从C库编译的目标文件.o(但在某些情况下编译为本机代码时需要)。

票数 4
EN

Stack Overflow用户

发布于 2011-12-26 01:20:23

你甚至应该保留这个库的源代码。在升级Ocaml编译器(例如从3.12升级到未来的3.13)时,如果不重新编译,以前的*.cmo*.cma文件将无法工作。

假设你总是可以清理和重新编译东西(例如,你有两个传统的目标cleanall to make),你只能保留*.cma

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8630599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档