并行安装不同的ocaml版本

时间:2011-07-05 15:24:12

标签: compilation ocaml xml-rpc

我正在尝试编译adder example ocaml包的xml-rpc-light。在包括(我怀疑所有)必要的库后,我在编译时遇到了这个错误:

File "_none_", line 1, characters 0-1:
Error: Files /[...]/godi/lib/ocaml/site-lib/xmlrpc-light/xmlrpc-light.cma(XmlRpcBase64)
       and /[...]/godi/lib/ocaml/std-lib/stdlib.cma(Buffer)
       make inconsistent assumptions over interface Buffer
Command exited with code 2.

我明白这意味着什么。基本上,不知何故,xmlrpc-light.cma和stdlib.cma不会采用相同的Buffer接口,这会在编译时产生类型错误。但是如何在不改变这些库代码的情况下协调它们呢?

在Ygrek和Gasche的回答之后编辑

从这两个答案中我想我现在知道问题是什么,但我不确定如何处理它。我使用GODI,通常在那里编译(3.11.2版本)。最近,我独立安装了OCaml 3.12只是为了玩它。现在,如果我转到一个新的命令行并写ocaml,那就是这个新的3.12启动了。目前,在GODI中,一切仍然像往常一样(或几乎 - 见下文),但如果我想安装一些非GODI库(如xmlrpc-light),我必须使用命令行。如果我尝试使用make编译xmlrpc-light,我会得到:

ocamlfind ocamlc -package xml-light,netclient,nethttpd-for-netcgi2 -c XmlRpc.mli
File "XmlRpc.mli", line 1, characters 0-1:
Error: /[...]/godi/lib/ocaml/pkg-lib/xml-light/xml.cmi
is not a compiled interface
make[1]: *** [XmlRpc.cmi] Error 2
make: *** [native-code-library] Error 2

为什么它在这里查看GODI库,尽管命令行中可用的ocaml是非GODI 3.12,ocamlfind实际上调用了/[...]/godi/bin/ocamlfind。我可以理解为什么3.12 ocaml抱怨xml.cmi不是编译接口(它是用GODI编译的 - 3.11.2)。

所以,总而言之,我的系统目前是一团糟。而且我不知道如何保持两个ocaml环境(GODI和3.12)并且每次选择我想要使用的那个。但如果它能解决我所有的问题,我很高兴删除3.12。

GODI

的问题

为了提供更多信息,我最近尝试添加godi-ocaml-xml-rpc库(因为它是一个替代的xml-rpc库,它可以在GODI中使用),但是我得到了

> ocamlfind ocamlopt -a -o xmlrpc.cmxa \
>   -predicates "" xmlRPCTypes.cmx xmlRPCDtd.cmx xmlRPCNet.cmx xmlRPCClient.cmx xmlRPCServer.cmx cgiSource.cmx  
> ocamlfind ocamlopt -o oxridl.opt -package "pcre annexlib" -linkpkg oxridl.ml
> cd /[...]/godi/build/godi/godi-ocaml-xml-rpc/work/ocaml-xml-rpc-0.2.6/httpd && make && make opt
> ocamlfind ocamlc -c -I .. httpdSource.mli -package "http annexlib"
> File "httpdSource.mli", line 1, characters 0-1:
> Error: ../xmlRPCServer.cmi
> is not a compiled interface
> make[7]: *** [httpdSource.cmi] Error 2
> Error: Exec error: File /[...]/godi/build/godi/godi-ocaml-xml-rpc/./makefile, line 38: Command returned with non-zero exit code
> Error: Exec error: File /[...]/godi/build/godi/godi-ocaml-xml-rpc/./../../mk/bsd.pkg.mk, line 1378: Command returned with non-zero exit code

### Error: Command fails with code 1: godi_console

我怀疑可能与同样的问题有关。奇怪的是,它抱怨xmlRPCServer.cmi不是编译界面,我认为,它恰好是应该编译安装godi-ocaml-xml-rpc的文件之一。

2 个答案:

答案 0 :(得分:3)

确保使用单一版本的ocaml编译器并重建xmlrpc。

更新

简单的经验法则 - 每个ocaml安装都有单独的ocamlfind,并确保在任何时间点只有一个ocaml + ocamlfind在PATH中。即将ocaml-3.12安装到/opt/ocaml-3.12并将新的ocamlfind安装到/opt/ocaml-3.12/bin中。然后,当你想使用ocaml 3.12时,只需使用PATH=/opt/ocaml-3.12/bin:$PATH,它将拾取ocamlfind并匹配ocaml,所有ocamlfind安装将与系统ocaml分开。旧的ocaml安装根本不会受到影响。

(可以使用单ocamlfind和许多ocaml安装,但这更复杂,我不推荐它 - 无论如何ocamlfind快速构建。)

答案 1 :(得分:2)

在ygrek上回答一下:这可能意味着xmlrpc-light已经针对标准库的不同版本进行编译(...而不是系统上可用的版本)。如果您在安装xmlrpc-light之后重新安装了新的标准库,或者使用为不同系统编译的二进制xmlrpc-light软件包,则可以执行此操作。解决方案可能是针对您当前的标准库重建xmlrpc。

这些界面版本控制问题很复杂,因为它们与C / C ++接口决策中的自定义不对应;在这些语言中,当包接口改变时,默认情况下假定它与先前的接口兼容。在OCaml中,它们被认为是不兼容的(它们比较整个模块接口的散列),并且重新编译是强制性的。

大多数包装工具,例如对于GNU / Linux发行版,假设默认情况下兼容,并且没有适当的工具来确保在接口更改时重新编译。专为OCaml设计的GODI执行依赖性跟踪(如果您在GODI中升级软件包,它将重新编译所有依赖软件包),Debian打包团队已制定了一个方案来实现与其打包系统相同的行为(有关此问题的更多详细信息,请参阅文章Enforcing Type-Safe Linking using Inter-Package Relationships)。其他一些工具对此非常谨慎,但不幸的是,这不是常态,您可能仍然只使用您的发行版的软件包管理器出现此类错误。