2013-04-12 9 views
10

私はOcamlプログラミングの初心者です。モジュールをプログラムにリンクする際に問題があります。実際に私はいくつかの正規表現のチェックをしているし、基本的には、Str moduleを使用して区切り文字列に基づいて文字列をトークン化する関数を書いています。だから私は、このようなライブラリで定義された関数を使用します。ocamlのモジュールをリンクする際にエラーが発生しました

Str.regexp_string /*and so on*/ 

を私はmlのファイルをコンパイルしようとすると、しかし、私は未定義のグローバル筋力を持っていることが示唆されたエラーを取得します。 List関数をList.lengthとタイプして使用します。特定のモジュールを明示的に含めることなくStrに対して行ったのと同じように機能します。私は

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

を使用するトップレベルで、私は私が最終的な実行可能ファイルを取得するには、エンドリンク3つのCMO年代にまで持っているのでmlのファイルにモジュールを含めたい場合、私は(ただし

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

を試してみましたトップレベルで走っていない)。私はこれが本当に基本的な質問だと知っていますが、私はそれを解決するのに苦労しています。前もって感謝します。

答えて

11

ファイルfoo.mlに何も追加する必要はありません。 foo.mlをコンパイルするときに、Strモジュールの場所をコンパイラに指示する必要があります。これを行うには、foo.mlをコンパイルするために使用されるコマンドラインに追加するには、次の標準ライブラリから

ocamlc str.cma foo.ml 

または

ocamlopt str.cmxa foo.ml 

Listと他のモジュールは、デフォルトでアクセスできますので、あなたはしないでください頻繁に使用されるモジュールについてコンパイラに伝える必要があります。

+0

最終的に生成された ".cmo"ファイルをリンクしたいと述べているため、あなたのソリューションはうまくいかないと思います。だから私が "Str"モジュールのいくつかの関数を使ってコンパイルしようとすると、あなたが言ったようにそれをコンパイルしてください。もし私がトップレベルに ".cmo"をロードすると、未定義のグローバルStrであるというエラーが表示されます –

+3

質問はスタンドアロンプ​​ログラムをリンクすることです。トップレベルへの答えは少し異なります。トップレベルでは、 '#load" str.cma "'と言ってStrをロードすることができます。 –

+0

...または 'ocaml str.cma'で' ocaml'トップレベルを呼び出します。 – nlucaroni

0

あなたは '-cclib'コンパイラ指令を使う必要があると思います。 モジュール名には、.cmaのように終わるファイルを含めないでください。 以下は、unixとthreadsモジュールを使用しようとしたときのことです。 私はあなたが 'カスタム'と 'cclib'コンパイラ指令のいくつかの組み合わせを使用する必要があると思います。

はocamlc -custom unix.cma threa.ml -cclib -lunix

ヘルプについては、この本の第7章を見てみましょう。 http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

そして、ここでコンパイラディレクティブの報道を見て: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual022.html#c:camlc

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"でうまくいくように見えるので、わからないことがあります。誰でもそれが何であるか知っていますか?

+1

'calc.ml'の前に' str.cma'を置く必要があります。 –

+0

'Std'でこの問題を解決する方法を知りましたか?私はここで同じ問題を抱えていますが、 'Std'だけで – Jay

関連する問題