【问题标题】:How to compile with a custom module如何使用自定义模块进行编译
【发布时间】:2012-11-07 15:18:59
【问题描述】:

我正在尝试用 2 .ml 编译一个项目,其中一个是遵循这种格式的模块

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

【问题讨论】:

    标签: module makefile ocaml ml


    【解决方案1】:

    每个 ml 源文件已经代表一个模块(名称与文件名相同)。 仔细阅读ocaml tutorial on modules

    【讨论】:

      【解决方案2】:

      为了扩大 ygrek 的答案,通过在名为 Mymodule.ml 的文件中声明一个名为 Mymodule 的模块,您正在创建一个名为 Mymodule.Mymodule 的模块。很可能您只想删除 .ml 和 .mli 文件中的 module Mymodule 包装器,然后一切都会按您的预期工作。本质上,OCaml 为每个源文件免费提供了一层模块包装。

      【讨论】:

        【解决方案3】:

        我找到了解决方案:)

        您必须在使用的库中更改正确的文件“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
        

        当我们定义同一个库两次或更多次时会发生这种情况。就我而言,库 Bigarray 足以包含 Unix 库。

        【讨论】:

          猜你喜欢
          • 2019-07-28
          • 1970-01-01
          • 2015-01-15
          • 2014-05-02
          • 2018-12-19
          • 1970-01-01
          • 2017-09-09
          • 1970-01-01
          • 2016-02-09
          相关资源
          最近更新 更多