我正在尝试编译xml-rpc-light ocaml包的adder example。在包含(我怀疑是所有)必要的库之后,我在编译时得到以下错误:
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没有假定相同的缓冲区接口,这会在编译时产生类型错误。但是,如何在不更改这些库的代码的情况下协调它们呢?
根据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尽管命令行中可用的ocaml是非GODI 3.12,但它之所以在这里研究GODI库,是因为ocamlfind实际上调用了/[...]/godi/bin/ocamlfind。我能理解为什么3.12ocaml抱怨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应该编译的文件之一。
发布于 2011-07-06 00:30:32
确保您使用的是ocaml编译器的单一版本并重新构建xmlrpc。
更新
简单的经验法则-为每个ocaml安装单独的ocamlfind,并确保在任何时间点的路径中只有一个ocaml + ocamlfind。例如,将ocaml-3.12安装到/opt/ocaml-3.12中,并将新的ocamlfind安装到/opt/ocaml-3.12/bin中。然后,当你想使用ocaml3.12时,只需使用PATH=/opt/ocaml-3.12/bin:$PATH,它就会拾取ocamlfind和匹配的ocaml,所有的ocamlfind安装都会从系统ocaml中分离出来。旧的ocaml安装将不会受到任何影响。
(可以使用单个ocamlfind和多个ocaml安装,但这比较复杂,我不建议这样做-- ocamlfind构建速度很快)。
发布于 2011-07-06 18:22:07
在ygrek上展开一点回答:这可能意味着xmlrpc-light已经针对不同版本的标准库(..而不是您系统上可用的)。如果您在安装xmlrpc-light之后重新安装了一个新的标准库,或者您使用的是为不同系统编译的二进制xmlrpc-light包,那么这是可能的。解决方案可能是根据当前的标准库重新构建xmlrpc。
这些接口版本控制问题很微妙,因为它们不符合C/C++接口决策中的习惯;在这些语言中,当包接口更改时,默认情况下假定与以前的接口兼容。在OCaml中,它们被认为是不兼容的(它们比较整个模块接口的散列),并且重新编译是强制性的。
大多数打包工具,例如用于GNU/Linux发行版的打包工具,都采用默认兼容的行为,并且没有适当的工具来确保在接口更改时重新编译。GODI是专门为OCaml设计的,它进行依赖跟踪(如果你在GODI中升级一个包,它将重新编译所有依赖的包),Debian打包团队有一个方案来实现他们的打包系统的相同行为(有关这方面的更多详细信息,请参阅文章Enforcing Type-Safe Linking using Inter-Package Relationships)。其他一些工具对此很小心,但不幸的是,这不是规范,仅使用发行版的包管理器可能仍然会出现这样的错误。
https://stackoverflow.com/questions/6585098
复制相似问题