2017-06-13 2 views
1

J'écris un grand projet OCaml. J'ai écrit un fichier foo.ml, qui fonctionne parfaitement. Dans un sous-répertoire du répertoire foo.ml, il y a un fichier bar.ml.Chargement des modules OCaml non dans le répertoire courant

bar.ml code des références dans foo.ml, de sorte que sa ligne d'ouverture est:

open Foo 

Cela me donne une erreur au moment de la compilation:

Unbound module Foo. 

Que puis-je faire pour corriger cela sans changer l'emplacement de foo.ml?

+1

Comment compiler/charger le fichier 'bar.ml'? – Bergi

+0

https://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec269 – Bergi

Répondre

6

Le chemin facile est d'utiliser un des systèmes de construction OCaml comme ocamlbuild ou oasis. Une autre option serait jbuilder mais jbuilder est assez opiniâtre sur l'organisation des fichiers et ne permet pas le type de structure de sous-répertoire que vous demandez. Le chemin le plus explicite est accompagné d'un avertissement: Le processus de construction OCaml est compliqué avec de nombreuses parties mobiles qui peuvent être difficiles à gérer. Après cet avertissement habituel, lorsque vous recherchez des modules, le compilateur OCaml recherche d'abord le module dans l'environnement de compilation actuel, puis recherche les fichiers compilés de l'interface ".cmi" dans les répertoires spécifiés par les indicateurs d'option "-I" (plus le répertoire courant et le répertoire de la bibliothèque standard). Afin de compiler votre fichier bar.ml, vous devrez ajouter le répertoire parent dans la liste des répertoires inclus avec l'option -I .. afin de compiler votre fichier bar.ml. Après tout cela, vous découvrirez que pendant la phase de liaison, tous les fichiers objet (c.-à-d. Cmo ou .cmx) doivent être listés dans un ordre topologique compatible avec le graphe de dépendance de votre projet. Par conséquent, permettez-moi de répéter mon conseil: utilisez un système de construction approprié.