11

私は Ocaml プログラミングの完全な初心者で、モジュールを自分のプログラムにリンクするのに問題があります。実際、私はいくつかの正規表現チェックを行っており、基本的にStr モジュールを使用して区切り文字列に基づいて文字列をトークン化する関数を作成しました。したがって、ライブラリで定義されている関数を次のように使用します。

Str.regexp_string /*and so on*/

ただし、ml ファイルをコンパイルしようとすると、未定義のグローバルStrがあることを示すエラーが表示されます。特定のモジュールを明示的にインクルードしなくても、Str の場合と同じように、List.length などを入力してList関数を使用します。私は試した

open Str;;
include Str;; /*None of these work and I still get the same error*/

ただし、トップレベルで使用する場合

load "str.cma" /*Then the program works without problems*/

モジュールをmlファイルに含めたいのは、最終的な実行可能ファイル(トップレベルでは実行されない)を取得するために最後に3つのcmoをリンクする必要があるためです。これが本当に基本的な質問であることは知っていますが、解決に苦労しています。前もって感謝します。

4

4 に答える 4

13

ファイル foo.ml に何も追加する必要はありません。foo.ml をコンパイルするときに、Str モジュールを見つける場所をコンパイラーに伝える必要があります。これを行うには、foo.ml のコンパイルに使用するコマンド ラインに追加します。

ocamlc str.cma foo.ml

また

ocamlopt str.cmxa foo.ml

List標準ライブラリの他のモジュールはデフォルトでアクセス可能であるため、頻繁に使用されるモジュールについてコンパイラに伝える必要はありません。

于 2013-04-12T13:21:32.240 に答える
0
ocamlc calc.ml str.cma -o calc
File "calc.ml", line 1:
Error: Error while linking calc.cmo:
Reference to undefined global `Str'

コードは非常にシンプルで、無駄を省きます。

let split_into_words s = 
    Str.split ( Str.regexp "[ \n\t]+") s ;;

let _ = 
    split_into_words "abc def ghi" ;;

ocaml 4.0.2 で。明らかにここに問題がありますが、私は初心者すぎてそれが何であるかを理解できません。トップレベルから見ると、#load "str.cma" で問題なく動作するように見えますが、ここで理解できないことがあります。誰がそれが何であるか知っていますか?

于 2013-12-12T14:23:53.510 に答える