ocaml - 通过 ocamlbuild/ocamlfind 链接库

标签 ocaml ocamlbuild js-of-ocaml

我有一个名为 ojasmine 的本地固定 OPAM 项目,我想将其编译为一个库,供另一个名为 test_tournabox 的项目使用(最终编译为 javascript)。但是,test_tournabox 的编译因链接错误而失败。

我编译ojasmine如下,给出目标ojasmine.cma:

ocamlbuild -cflag -annot -use-ocamlfind -pkgs js_of_ocaml.log,js_of_ocaml,js_of_ocaml.syntax -syntax camlp4o ojasmine.cma
Finished, 5 targets (5 cached) in 00:00:00.

然后我像这样安装它:
ocamlfind install ojasmine META _build/ojasmine.cma

我发现很奇怪 ojasmine.cma 不在我的项目目录中,而是在 _build 目录中。

输出是:
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/ojasmine.cma
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/META

接下来,我cd到我的 Tournabox 项目并尝试构建测试套件:
ocamlbuild -cflag -annot -use-ocamlfind -pkgs js_of_ocaml.log,js_of_ocaml,js_of_ocaml.syntax,ojasmine -syntax camlp4o test_tournabox.byte
+ ocamlfind ocamlc -linkpkg -syntax camlp4o -package ojasmine -package js_of_ocaml.syntax -package js_of_ocaml -package js_of_ocaml.log choice.cmo util.cmo entry.cmo ttypes.cmo columns.cmo countries.cmo country_group.cmo jsutil.cmo performance_group.cmo round_group.cmo seed_group.cmo tlog.cmo tourney.cmo tournabox_lib.cmo test_tournabox.cmo -o test_tournabox.byte

这失败并出现错误:
Error: Error while linking test_tournabox.cmo:
Reference to undefined global `Ojasmine'

似乎 ojasmine.cma 没有链接到可执行文件 test_tournabox.byte 中。但我希望 ocamlfind 的 -linkpkg 参数能够对此进行安排。我错过了什么?

编辑:这是 META 文件:
description = "Unit Tests for javascript"
requires = "js_of_ocaml,js_of_ocaml.syntax"
version = "0.1"

这是 ocamlobjinfo:
trusty)laheadle@localhost:~/ocaml/ojasmine$ ocamlobjinfo _build/ojasmine.cma 
File _build/ojasmine.cma
Force custom: no
Extra C object files:
Extra C options:
Extra dynamically-loaded libraries:
Unit name: Ojasmine
Interfaces imported:
        ef5bf1a1d49ad28ddd8176a4f17055e1        Ojasmine
        c1a8a443b33589e4865a918c21fbbeb4        Js
        5de66fdff01f2735974be770893841e1        Pervasives
        a88f91d0f04fd66bc0bbaaf347081e95        CamlinternalFormatBasics
Uses unsafe features: no
Force link: no

ocamlfind 看到它:
(trusty)laheadle@localhost:~/ocaml/ojasmine$ ocamlfind query ojasmine
/home/laheadle/.opam/4.02.0/lib/ojasmine

这里是:
(trusty)laheadle@localhost:~/ocaml/ojasmine$ ls `ocamlfind query ojasmine`
META  ojasmine.cma

这是 ojasmine.ml:
open Js

let describe (s : js_string t) (f: unit -> unit) : unit =
  Js.Unsafe.fun_call (Js.Unsafe.variable "describe")
    [| Js.Unsafe.inject s;
       Js.Unsafe.inject (Js.wrap_callback f) |]

let it (s : js_string t) (f: unit -> unit) : unit =
  Js.Unsafe.fun_call (Js.Unsafe.variable "it")
    [| Js.Unsafe.inject s;
       Js.Unsafe.inject (Js.wrap_callback f) |]

class type matcher = object
  method toBe: bool t -> unit meth
  method _not: matcher t readonly_prop
end

let expect_bool (b: bool t) : matcher t =
  Js.Unsafe.fun_call (Js.Unsafe.variable "expect") [|Js.Unsafe.inject b; |]

和 ojasmine.mli:
open Js
val describe: js_string t -> (unit -> unit) -> unit

val it: js_string t -> (unit -> unit) -> unit

class type matcher = object
  method toBe: bool t -> unit meth
  method _not: matcher t readonly_prop
end

val expect_bool: bool t -> matcher t

最佳答案

您的 META文件应包含 archive变量,所以 ocamlfind可以将您的程序与存档正确链接,而不是目标文件。您还需要安装 cmi文件。 (而且,虽然编译不需要它,但安装 mli 文件是一个好方法)。因此,将以下内容添加到您的 META

archive(byte) = "ojasmine.cma"

并且不要忘记安装 cmi .

关于ocaml - 通过 ocamlbuild/ocamlfind 链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27906884/

相关文章:

set - OCaml 中的异构集

file - 在 OCaml 的父目录中创建文件?

ocaml - oasis 选择了错误的 ocamlbuild

ocaml - 告诉 ocamlbuild 使用 Core

exception - CLR 与 OCaml 异常开销

ocaml - OCaml 中 Array.create 的奇怪之处

javascript - 如何构造一个js对象并用js_of_ocaml调用它的方法?

OCaml 作为编译目标

curl - js_of_ocaml : missing primitive when calling ocurl and str

haskell - 在 OCaml 中派生实现