4

OCaml プログラム (main メソッドを使用 - 実行可能ファイルを生成) があり、それをライブラリとして使用したいと考えています。

私は次のようにプログラムをコンパイルしていました:ocamlc -I someDir -g -unsafe lotsOfCmoFiles -o outputFileプログラムは正常に動作します。

今、私はそれを実行可能にする行(のようなもの)を削除し、コマンドをコンパイルするためのパラメータをlet _ = ...追加しています:-aocamlc -a -I someDir -g -unsafe lotsOfCmoFiles -o outputFile.cma

しかし、どういうわけか、生成された .cma ファイルをロードできずocamltopocamlbrowser空のリストが表示されます。からロードしようとするとocamltop

# #load "outputFile.cma";;
Error: Reference to undefined global `Xyz'

そして、xyz.cmo が に含まれていることは 100% 確信していlotsOfCmoFilesます。

コンパイル中に間違ったパラメーターを指定していますか? または、自分のプログラムを ocamltop にロードするにはどうすればよいですか? (このライブラリを別のプログラムで使用します。例として ocamltop の出力を示します)

どんな助けでも大歓迎です。

編集:@cagoのおかげで、最終的にコンパイルしてロードすることができました。これで、ライブラリをロードできます。メインlet _ = ...ラインを削除しないと、ロード時に自動的に実行されます.cma.

しかし、まだモジュールを開くことができません。奇妙なことに、これは例外を発生させません

open Main

しかし、モジュール Main から関数を呼び出すと、次のようになります。

# someFun;;
Error: Reference to undefined global `Main'

ocamlbrowseそれでも空のリストが表示されます。今それはなぜですか?

EDIT2:open Mainメインモジュールが同じフォルダーにあるため(明示的にロードしていなくても)、失敗しないことに気付きました。.cma ファイルを別の場所に移動してロードすると機能します (つまり、メイン関数が自動的に実行されます) が、ocamlobjinfoモジュールが表示されていてもモジュールを開くことができません。

EDIT3: -私は助けません:

$ ocaml
        OCaml version 4.00.1

# #load "lib.cma";;
ok
# open Lib;;
Error: Unbound module Lib
# 
$ ocaml -I libFolder    
        OCaml version 4.00.1

# #load "toylib.cma";;
ok
# open Lib;;
# fun;;
Error: Reference to undefined global `Lib'
4

2 に答える 2

8

lotsOfCmoFilesモジュール Xyz を知る必要がある cmo の一部。cmo ファイル間の依存関係に注意する必要があります。

例えば:

toto.ml:

let x = "toto"

titi.ml:

let y = Toto.x ^ " titi"

ocamlc -c toto.ml
ocamlc -c titi.ml
ocamlc -a  titi.cmo toto.cmo -o lib.cma (* here is  the probleme *)

# #load "lib.cma"
Error: Reference to undefined global `Toto'

titi は toto に依存しているため、cmos の順序を変更する必要があります。

ocamlc -a toto.cmo titi.cmo -o lib.cma 

# #load "lib.cma"
# Titi.y;;
 - : string = "toto titi"

編集:

たとえば、cma がサブディレクトリにある場合、呼び出し時にocamlパスを指定する必要があります。

ocaml -I subdir/ (* subdir which contains lib.cma *)

# #load "lib.cma"
# Toto.x;;
- : string = "toto"
于 2013-03-04T12:26:51.213 に答える