2010-10-03 13 views
17

Mi problema es que ocamlc y ocamlopt apear se niegan 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 OCaml, y rápidamente lo escribí como un error personal en la comprensión de la compilación OCaml. Pronto, sin embargo, me encontré con el mismo problema al tratar de compilar proyectos de otras personas bajo sus propias instrucciones.Módulos no vinculados en OCaml

Este es el ejemplo más sencillo. Todos los demás usan ocamlbuild, lo que ofusca 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 ocamlc con los caminos obsolute a los archivos llvm, al igual que ...

$ 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?

Respuesta

15

Su comando hace dos cosas: compila minml.ml (en minml.cmo), y luego vincula el objeto resultante a minml.

La compilación de un módulo requiere las interfaces de las dependencias. Las interfaces contienen información de tipeo que es necesaria tanto para el verificador de tipos como para el generador de códigos; esta información no se repite en la implementación (.cma aquí). Por lo tanto, 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 del código byte 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 desea hacer las dos 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 
+0

Aha! Gracias por una respuesta tan completa. – Eli

+1

¿Tiene alguna teoría de cómo estas otras personas esperan que el programa compile sin estas banderas? Jon Harrop no es exactamente un aficionado. Sospecho que hay un método para esta locura. – Eli

+3

@itsmyown: en el caso de Jon, podría estar compilando el ejemplo en el directorio donde acaba de compilar los enlaces LLVM, o podría haber instalado esos enlaces directamente en el directorio de la biblioteca Ocaml en lugar de en un subdirectorio. La audiencia del mensaje caml-list que usted cita sabría agregar '-I' según sea necesario. Por cierto, no estoy seguro de si '-cc g ++' es realmente necesario. – Gilles