1

2 つの .ml でプロジェクトをコンパイルしようとしていますが、そのうちの 1 つはこの形式に従うモジュールです。

module Mymodule =  
  struct  
  ...  
  end;; 

myModule の .mli も作成しました

module Mymodule =  
  sig  
  ...  
  end 

しかし今、main.ml で Mymodule.myfunction を呼び出すと、"Unbound value Mymodule.myfunction".

これが私のmakefileです(標準のOcamlMakeFileもあります):

RESULT= result  
SOURCES= Mymodule.ml main.ml  
LIBS= bigarray sdl sdlloader sdlttf sdlmixer

INCDIRS= +sdl

include OCamlMakefile

私は検索していくつかのことを試しましたが、何も機能していません:(


回答ありがとうございます。リンクしたチュートリアルに従いましたが、SDL リンクに問題があります。

File "testsdl_2.ml", line 1, characters 0-1:
Error: No implementations provided for the following modules:
         Sdl referenced from testsdl_2.cmx
         Sdlloader referenced from testsdl_2.cmx
         Sdlvideo referenced from testsdl_2.cmx

そして、私はこの行を使用してコンパイルしています:

ocamlopt -I +sdl -o testsdl mymodule.cmx main.ml
4

3 に答える 3

1

各 ml ソース ファイルは、既にモジュールを表しています (名前はファイル名と同じです)。モジュールに関する ocaml チュートリアルをよく読んでください。

于 2011-09-14T12:04:44.060 に答える
1

私は解決策を見つけました:)

使用するライブラリの適切なファイル「META」を変更する必要があります。odepack私の場合、次の行を追加して、ライブラリ内の META ファイルを変更する必要があります。

requires = "bigarray"

その後、Makefile を少し変更する必要があります。この線

LIBS = unix str bigarray

に変更されます

LIBS = str

この変更により、エラーが回避されます

File "_none_", line 1, characters 0-1:
Error: Files /usr/lib/ocaml/unix.cmxa and /usr/lib/ocaml/unix.cmxa
   both define a module named Unix

これは、同じライブラリを 2 回以上定義した場合に発生します。私の場合、ライブラリはライブラリBigarrayを含めるのに十分Unixです。

于 2011-11-10T09:25:07.407 に答える
1

ygrek の回答を少し拡大するには、Mymodule.ml という名前のファイル内で Mymodule という名前のモジュールを宣言することで、Mymodule.Mymodule という名前のモジュールを作成します。ほとんどの場合module Mymodule、.ml ファイルと .mli ファイルのラッパーを削除するだけで、期待どおりに機能します。本質的に、OCaml は各ソース ファイルで無料でモジュール ラッピングの 1 つのレイヤーを提供します。

于 2011-09-14T17:53:47.200 に答える