5

ojasmine というローカルに固定された OPAM プロジェクトがあり、これをライブラリとしてコンパイルして、test_tournabox という別のプロジェクト (最終的には JavaScript にコンパイル) で使用します。ただし、test_tournabox のコンパイルはリンク エラーで失敗しています。

ターゲット ojasmine.cma を指定して、次のように ojasmine をコンパイルします。

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
4

1 に答える 1

3

オブジェクトファイルではなく、プログラムをアーカイブに適切にリンクできるように、ファイルには変数METAが含まれている必要があります。また、ファイルをインストールする必要があります。(そして、コンパイルには必要ありませんが、ファイルをインストールするには良い方法です)。したがって、以下をarchiveocamlfindcmimliMETA

archive(byte) = "ojasmine.cma"

インストールすることを忘れないでくださいcmi

于 2015-01-12T23:32:44.990 に答える