2011-07-05 148 views
2

我試圖編譯xml-rpc-light ocaml軟件包的adder example。包括(我懷疑所有)必要的庫後,我在彙編時出現此錯誤:並行安裝不同的ocaml版本

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的光,我得到:

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。

回答

3

確保您使用的是單一版本的ocaml編譯器並重建xmlrpc。

UPDATE

拇指簡單的規則 - 爲每個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快速構建)。

+0

感謝您的幫助!我編輯了我的答案並添加了更多信息。有什麼想法嗎? – Surikator

+0

更新了答案。 – ygrek

+0

謝謝!那裏有兩個獨立的ocamlfinds。問題是,一切都在PATH中,正如你指出的那樣,它使用一個ocamlfind和另一個ocaml安裝。全部排序! – Surikator

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)。其他一些工具對此很謹慎,但不幸的是,這不是常態,並且您可能仍然只使用發行版的包管理器發生此類錯誤。

+0

感謝您的幫助!我編輯了我的答案並添加了更多信息。有什麼想法嗎? – Surikator

相關問題