module - Módulos sin consolidar en OCaml
compiler-errors (1)
Su comando está haciendo dos cosas: está compilando minml.ml
(en minml.cmo
), y luego vincula el objeto resultante en minml
.
La compilación de un módulo requiere las interfaces de las dependencias. Las interfaces contienen información de escritura que es necesaria tanto para el comprobador de tipos como para el generador de código; esta información no se repite en la implementación ( .cma
aquí). Así que para la etapa de compilación, llvm.cmi
debe estar disponible. El compilador lo busca en la ruta de inclusión, por lo que necesita un -I +llvm-2.7
adicional (que es la abreviatura de -I /usr/lib/ocaml/llvm-2.7
).
La etapa de enlace requiere llvm.cma
, que contiene la implementación de bytecode del módulo. Aquí, puede usar -I
o dar una ruta completa para que ocamlc
sepa dónde encontrar el archivo.
ocamlc -g -dtypes -I +camlp4 -I +llvm-2.7 -pp camlp4oof -c minml.ml
ocamlc -g -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma minml.cmo -o minml
o si quieres hacer ambas etapas en un solo comando:
ocamlc -g -dtypes -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma -pp camlp4oof minml.ml -o minml
Mi problema es que ocamlc y ocamlopt parecen negarse a encontrar bibliotecas de terceros instaladas a través de apt-get. Comencé a tener este problema cuando intenté incorporar módulos de terceros en mis propios programas de OCaml, y rápidamente lo descarté como una falla personal en la compilación de OCaml. Pronto, sin embargo, me encontré con el mismo problema al intentar compilar proyectos de otras personas siguiendo sus propias instrucciones.
Aquí está el ejemplo más directo. Todos los demás usan ocamlbuild, que oculta las cosas un poco.
El programa: http://groups.google.com/group/fa.caml/msg/5aee553df34548e2
La compilación:
$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml
File "minml.ml", line 43, characters 0-9:
Error:Unbound module Llvm
Incluso cuando proporciono a ocamlc las rutas obsoletas a los archivos llvm, como así ...
$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml
... en vano.
¿Qué estoy haciendo mal?