Я загрузил очень маленький пример проекта в github репозиторий
У меня есть школьный проект.В спецификациях говорится, что мы можем включить или отключить компонент.
Я пришел из мира c, в котором мы можем скомпилировать c для объекта, и выбрал объект для связи.Я пытаюсь это сделать в OCaml.
У меня есть два исходных файла с одной и той же функцией, но их эффект различен.У меня есть две папки с именем «on» для реализации и папка «off» с пустым телом
Для теста у меня есть простой файл a.ml и a.mli, который печатает только hello world и b.mlib.ml, который вызывает модуль a.(поэтому у меня есть on / a.ml и off / a.ml)
Я компилирую версию on и off этой командой:
ocamlc -c -I on on/a.mli on/a.ml -o on/a.cmo
, затем пытаюсь связать C-way
ocamlc on/a.cmo b.ml -o on_b.exe
но я получаю ошибку
File "b.ml", line 1, characters 9-15:
Error: Unbound module A
Я прочитал, я должен указать папку для поиска с -I.
ocamlc -I on -I off on/a.cmo b.ml -o on_b.exe
Я был счастлив из-за этой работы для включенной версии
, но она не будет работать для выключенной версии
ocamlc -I on -I off off/a.cmo b.ml -o off_b.exe
Я получаю ошибку
Error: Files b.cmo and off/a.cmo
make inconsistent assumptions over interface A
У меня естьпри проверке с ocamlobjinfo кажется, что он строит поиски B для первого модуля с именем A
. В этом примере у меня есть только A и B, но в будущем я буду собирать с какой-то версией и выключенной ... ноне делайте этого вручную
Решение найдено, но не очень эффективно, это очистить все файлы .cmo и .cmi ...
спасибо за ваше чтение и ваше время
РЕДАКТИРОВАТЬ:
Я также тестировал с -open, но, похоже, он работает только для стандартных модулей.