2010-01-07 2 views
4

Я пытаюсь использовать ocamlfind как с компилятором OCaml, так и с дополнением. Из того, что я понял, мне нужно поместить необходимые библиотеки в файл _tags в корень моего проекта, чтобы инструмент ocamlfind позаботился о его загрузке, что позволило мне открыть их в моих модулях следующим образом:Использование «ocamlfind» для создания библиотек OCaml и toplevel find (конкретных проектов)

open Sdl 
open Sdlvideo 
open Str 

в настоящее время мой файл _tags выглядит следующим образом:

<*>: pkg_sdl,pkg_str 

я могу, по-видимому запустить команду ocamlfind с ocamlc или ocamlopt аргумента, при условии, я wan't составить свой проект, но я не видят возможности запуска топлекса в том же человеке нер. Есть ли способ сделать это (что-то вроде «ocamlfind ocaml»)?

Я также не знаю, как разместить модули проекта в файле _tags: представьте, что у меня есть имя модуля Земля. В настоящее время я использую директиву #use "land.ml", чтобы открыть файл и загрузить модуль, но было высказано предположение, что это не очень хорошая практика. Какой синтаксис следует использовать в _tags для его указания, он должен быть загружен ocamlfind (учитывая, что land.ml не находится в пути поиска ocamlfind)?

Спасибо, Charlie P.

Edit: В соответствии с первым ответом на эту должность, файл _tags не должен использоваться с ocamlfind. Вышеупомянутые вопросы все еще стоят, есть только новый список: какой правильный способ указать библиотеки на ocamlfind?

+0

#use "land.ml" не загружает модуль, а содержимое файла. – nlucaroni

ответ

3

Файл _tags не для ocamlfind, а для ocamlbuild. Exemple: ocamlbuild land.native

4

попробовать это:

$ cat >> .ocamlinit 
#use "topfind";; 
#require "sdl";; 
#require "sdlvideo";; 

open Sdl 
open Sdlvideo;; 
open Str;; 

.ocamlinit добыт из текущего каталога, отступая к /home/user/.ocamlinit. вы можете явно переопределить его через ocaml -init <filename>

4

Следует различать пакеты ocamlfind, имена модулей и имена файлов. Исходный код ссылается только на имена модулей. Модули предоставляются файлами .cma .cmo .cmx (и .cmi). Пакеты Ocamlfind называются наборами таких файлов (двоичные файлы, созданные из некоторых источников библиотеки ocaml). Ocamlfind не является строгой необходимостью для создания проекта - просто укажите пути ко всем используемым библиотекам через -I. Но если проект распространяется в исходной форме - у других людей возникнут проблемы, потому что используемые библиотеки размещаются в разных местах. Затем каждый ищет способ указать имена используемых «сторонних частей кода» и некоторый внешний инструмент для разрешения этих имен на фактические пути. Этот инструмент является ocamlfind.

  • Сначала найдите пакет ocamlfind, который обеспечивает вам модули (в данном случае КДС и Sdlvideo - просто запустить ocamlfind list, скорее всего, пакет называется sdl
  • Compile с ocamlfind ocamlc -package <package name> -linkpkg source.ml -o program
  • Также можно использовать ocamlfind к. извлеките путь к.cma-файл (и другие), предоставляемые пакетом (ocamlfind query <package name>), и используйте этот путь с помощью инструмента построения (простой Makefile, ocamlbuild и т. д.).
  • Кроме того, ocamlfind (предназначен для) забрал бремя запоминания того, как названы фактические .cma-файлы, и какие требуются параметры компилятора и в каком порядке пакеты зависят друг от друга. Нужно просто указать имя пакета.

Имейте в виду, что не существует один-к-одному строгое формальное отношение между именем библиотеки (чисто человеческое таргетингом имя, например, ocaml-extlib), имена модулей (ExtLib, Enum, IO и т.д.), имена файлов (extLib.cma) и имя пакета ocamlfind (extlib), хотя для удобства сопровождающих и авторов библиотек обычно выбирают допустимые имена :)