Модуль освобождения локальной библиотеки OCamlfind

Я пытаюсь использовать ocamlfind для установки библиотеки. Я использую OCamlMakeFile. Вот мой Makefile:

OCAMLMAKEFILE = OCamlMakeFile

RESULT = owebl
SOURCES = src/utils.ml src/verb.ml src/request.ml src/template.ml src/response.ml src/rule.ml src/handler.ml src/server.ml
PACKS = unix str

all: native-code-library byte-code-library
install: libinstall
uninstall: libuninstall

include $(OCAMLMAKEFILE)

Так что в основном библиотека представляет собой набор модулей, которые я хочу распространять. Основное использование библиотеки (main.ml):

open Response
open Rule
open Verb
open Server

let handler =
    Handler.create
        (StaticRouteRule.create "/" [GET])
        (FileResponse.create
            ~static_file:(FileResponse.StaticFile "/index.html")
            ())

let server = Server.create "0.0.0.0" 8080 [handler];;

server#serve

Я компилирую библиотеку, просто запустив "make". Он генерирует три файла: "owebl.a, owebl.cma, owebl.cmxa". Затем я устанавливаю библиотеку с помощью ocamlfind:

ocamlfind install owebl META owebl.a owebl.cma owebl.cmxa

О, файл META:

version = "0.1"
name = "OWebl"
description = "A Web Framework for OCaml"
archive(byte) = "owebl.cma"
archive(native) = "owebl.cmxa"
requires = "unix,str"

Все работает, пока я не попытаюсь скомпилировать приведенный выше пример, который использует библиотеку. Я бегу:

ocamlbuild -use-ocamlfind -pkgs owebl main.native

И я получаю:

ocamlbuild -use-ocamlfind -pkgs owebl main.native
+ ocamlfind ocamlc -c -package owebl -o main.cmo main.ml
File "main.ml", line 1, characters 5-10:
Error: Unbound module Owebl
Command exited with code 2.
Hint: Recursive traversal of subdirectories was not enabled for this build,
  as the working directory does not look like an ocamlbuild project (no
  '_tags' or 'myocamlbuild.ml' file). If you have modules in subdirectories,
  you should add the option "-r" or create an empty '_tags' file.

  To enable recursive traversal for some subdirectories only, you can use the
  following '_tags' file:

      true: -traverse
      <dir1> or <dir2>: traverse

Compilation unsuccessful after building 2 targets (1 cached) in 00:00:00.
make: *** [fileserver] Error 10

Я пытался добавить open Owebl к началу main.ml, но я только что получил "unbound module Owebl" аналогичным образом. Я довольно растерялся относительно того, почему все эти модули не связаны. Что мне не хватает?

2 ответа

Решение

Вы должны использовать LIB_PACK_NAME переменная, если вы хотите упаковать свои модули под зонтичным пространством имен, например OWeblв противном случае они будут доступны как есть, например Response, Ruleи т. д. Также необходимо указать mli файлы, а также ml файлы в SOURCES переменная. И, наконец, вы не должны забывать установить cmi файлы, а также .a файлы. Установка mli Файлы также считаются хорошей традицией, хотя это не является строго обязательным. Также рассмотрите возможность использования OCamlMakefile средства установки вместо пользовательского сценария установки.

Я больше не использую OCamlMakefile, поэтому не уверен, но при условии, что OCamlMakefile компилирует вещи с -for-pack OWebl вариант и правильно собирает упакованный модуль owebl.cmoВам также необходимо установить owebl.cmi,

Компилятор OCaml ищет cmi файлы для проверки существования модулей и получения информации о их типах. Если не установлен, компилятор не может найти его. cma а также cmxa файлы являются коллекциями объектов и не предоставляют информацию о типе.

Другие вопросы по тегам