4

OCaml コンパイラとトップレベルの両方でocamlfindを使用しようとしています。私が理解したことから、必要なライブラリをプロジェクトのルートにある _tags ファイルに配置する必要があります。これにより、ocamlfindツールがそれらをロードし、モジュールで次のように開くことができるようになります。

open Sdl
open Sdlvideo
open Str

現在、_tags ファイルは次のようになっています。

<*>: pkg_sdl,pkg_str

プロジェクトをコンパイルしたくない場合は、ocamlc または ocamlopt 引数を指定してocamlfindコマンドを起動できるようですが、同じ方法でトップレベルを起動するオプションが表示されませんでした。これを行う方法はありますか (" ocamlfind ocaml" のようなもの)?

また、プロジェクト固有のモジュールを _tags ファイルに配置する方法もわかりません。モジュール名がLandであると想像してください。現在、#use "land.ml"ディレクティブを使用してファイルを開いてモジュールをロードしていますが、これは適切な方法ではないことが示唆されています。ocamlfindによって読み込まれるように指定するには、_tags でどの構文を使用する必要がありますか(land.ml が ocamlfind 検索パスにないことを考慮してください)。

ありがとう、チャーリーP。

編集: この投稿の最初の回答によると、 _tags ファイルは ocamlfind では使用されませ。上記の質問はまだ残っています。リストに新しいものがあります: ocamlfindにライブラリを指定する正しい方法は何ですか?

4

3 に答える 3

4

これを試して:

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

open Sdl
open Sdlvideo;;
open Str;;

.ocamlinitは現在のディレクトリから取得され、にフォールバックし/home/user/.ocamlinitます。経由で明示的にオーバーライドできますocaml -init <filename>

于 2010-01-08T12:13:48.370 に答える
4

ocamlfind パッケージ、モジュール名、およびファイル名を区別する必要があります。ソース コードはモジュール名のみを参照します。モジュールは .cma .cmo .cmx (および .cmi) ファイルで提供されます。ocamlfind パッケージは、そのようなファイル (いくつかの ocaml ライブラリ ソースから構築されたバイナリ) の名前付きコレクションです。プロジェクトのビルドに Ocamlfind は厳密には必要ありません。使用するすべてのライブラリへのパスを -I で指定するだけです。しかし、プロジェクトがソース形式で配布されている場合、使用されているライブラリが別の場所に配置されるため、別の人がビルドに問題を抱えることになります。次に、使用されている「サードパーティのコード片」の名前を指定する方法と、それらの名前を実際のパスに解決するための外部ツールを探します。このツールは ocamlfind です。

  • 最初に、必要なモジュールを提供する ocamlfind パッケージを見つけます (この場合は Sdl と Sdlvideo - 実行するだけです。ocamlfind listほとんどの場合、パッケージの名前はsdl.
  • でコンパイルocamlfind ocamlc -package <package name> -linkpkg source.ml -o program
  • または、ocamlfind を使用して、パッケージ ( ocamlfind query <package name>) によって提供される .cma ファイル (およびその他) へのパスを抽出し、このパスをビルド ツール (プレーンな Makefile、ocamlbuild など) で使用します。
  • さらに、ocamlfind (目的) は、実際の .cma ファイルがどのように命名されているか、どの一致するコンパイラ オプションが必要であるか、およびパッケージが相互に依存している順序を覚えておくという負担を取り除きます。パッケージ名を指定するだけです。

便宜上、ライブラリ名 (純粋に人間を対象とした名前などocaml-extlib)、モジュール名 ( ExtLibEnumIOなど)、ファイル名 ( extLib.cma)、および ocamlfind パッケージ名 ( )の間には、1 対 1 の厳密な正式な関係はないことに注意してください。extlibパッケージメンテナーとライブラリ作成者は通常、推測可能な名前を選択します:)

于 2010-01-13T13:29:19.877 に答える
3

_tags ファイルは ocamlfind 用ではなく、ocamlbuild 用です。例: ocamlbuild land.native

于 2010-01-07T19:54:31.243 に答える