2012-04-25 4 views
4

Я выполнил инструкции here для установки установки библиотеки в site-lib с помощью ocamlfind install. У меня было две библиотеки: одна называлась логикой, а другая - логической. В каждом случае я установил .cmo, .cmx, .cmi и .mli файлы в библиотеке, например:Настройка библиотеки Ocaml с использованием «ocamlfind install», а затем с использованием библиотеки в ocamlbuild

ocamlfind install boolean META boolean.cmo boolean.cmx boolean.cmi boolean.mli 

Затем, когда я пошел, чтобы построить еще один проект, который зависит от логики и логического значения, используя ocamlbuild, я получил следующее сообщение об ошибке:

$ocamlbuild -use-ocamlfind test_logic.native -classic-display 
... 
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -c -package boolean -package deriving- ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o -o test_logic.cmx test_logic.ml 
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg -package boolean -package deriving-ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o vhdl.cmx fsm.cmx test_logic.cmx -o test_logic.native 
+ /home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg -package boolean -package deriving-ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o vhdl.cmx fsm.cmx test_logic.cmx -o test_logic.native 
gcc: /home/phil/godi-3.12.1.0/lib/ocaml/site-lib/logic/logic.o: No such file or directory 
gcc: /home/phil/godi-3.12.1.0/lib/ocaml/site-lib/boolean/boolean.o: No such file or directory 
File "caml_startup", line 1, characters 0-1: 
Error: Error during linking 
Command exited with code 2. 

Я тогда скопировал .o файлов из логики и логических проектов к их соответствующим областям в месте Пба и скомпилирован и связан хорошо.

Мне интересно, зачем нужны файлы .o и почему здесь участвует gcc?

Вот подам _tags в случае это помогает:

<*.ml> or "test_logic.native" or "test_loginc.byte": package(boolean),package(unix),  package(oUnit), package(deriving-ocsigen), package(deriving-ocsigen.syntax), syntax(camlp4o), package(logic) 
+0

Я не знаю деталей, однако ocamlopt является родным компилятором. Он генерирует файл .o и файл .cmx. Их нужно держать вместе в паре. ocamlopt делает ссылку, запуская компоновщик внутри, и часто использует gcc в качестве компоновщика. Вы можете увидеть команды, которые он запускает с помощью флага -verbose. –

+0

не должно быть файлов .cmx в библиотеке (в site-lib/logic и site-lib/boolean)? – aneccodeal

+0

Ну, ocamlopt не работает. Файл .o содержит весь сгенерированный код. Файл .cmx - это просто метаинформация. Это полезно, потому что вы можете просто использовать стандартные инструменты Unix для файлов .o. Например, вам не нужен специальный линкер. –

ответ

4

См Section 11.1 of the OCaml Manual:

Из файла X.ml, то ocamlopt компилятор производит два файла: XO, содержащий машинный код объекта, и x.cmx, содержащие дополнительную информацию для компоновки и оптимизации клиентов устройства. Скомпилированную реализацию всегда следует ссылать под именем x.cmx (при задании файла .o или .obj ocamlopt предполагает, что он содержит код, скомпилированный из C, а не из Caml).