Модуль освобождения локальной библиотеки 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
файлы являются коллекциями объектов и не предоставляют информацию о типе.