首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ocamlbuild/ocamlfind连接库

通过ocamlbuild/ocamlfind连接库
EN

Stack Overflow用户
提问于 2015-01-12 16:50:36
回答 1查看 1.1K关注 0票数 5

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

我按照以下方式编译了ojasmine,给出了目标ojasmine.cma:

代码语言:javascript
复制
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.

然后我按如下方式安装:

代码语言:javascript
复制
ocamlfind install ojasmine META _build/ojasmine.cma

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

产出如下:

代码语言:javascript
复制
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/ojasmine.cma
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/META

接下来,我使用了cd项目并尝试构建测试套件:

代码语言:javascript
复制
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

这与错误失败:

代码语言:javascript
复制
Error: Error while linking test_tournabox.cmo:
Reference to undefined global `Ojasmine'

ojasmine.cma似乎没有链接到可执行的test_tournabox.byte。但是,我希望-linkpkg参数能够找到解决这个问题的方法。我遗漏了什么?

编辑:这是元文件:

代码语言:javascript
复制
description = "Unit Tests for javascript"
requires = "js_of_ocaml,js_of_ocaml.syntax"
version = "0.1"

这里是ocamlobjinfo:

代码语言:javascript
复制
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

奥卡姆发现了它:

代码语言:javascript
复制
(trusty)laheadle@localhost:~/ocaml/ojasmine$ ocamlfind query ojasmine
/home/laheadle/.opam/4.02.0/lib/ojasmine

下面是:

代码语言:javascript
复制
(trusty)laheadle@localhost:~/ocaml/ojasmine$ ls `ocamlfind query ojasmine`
META  ojasmine.cma

以下是ojasmine.ml:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-12 23:32:44

您的META文件应该包含一个archive变量,以便ocamlfind能够正确地将您的程序链接到归档文件,而不是对象文件。此外,您还需要安装cmi文件。(虽然编译不需要它,但是安装mli文件是一种很好的方式)。因此,将以下内容添加到您的META

代码语言:javascript
复制
archive(byte) = "ojasmine.cma"

并且不要忘记安装cmi

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27906884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档