2015-01-12 14 views
5

Ho un progetto OPAM localmente bloccato chiamato ojasmine che voglio compilare come libreria da utilizzare da un altro progetto chiamato test_tournabox (che infine compila in javascript). Tuttavia, la compilazione di test_tournabox non riesce con un errore di collegamento.Collegamento di una libreria tramite ocamlbuild/ocamlfind

posso compilare ojasmine come segue, dando l'ojasmine.cma bersaglio:

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. 

Poi lo installo in questo modo:

ocamlfind install ojasmine META _build/ojasmine.cma 

ho trovato strano che ojasmine.cma non era nel mio directory del progetto, ma invece è nella directory _build.

L'output è:

Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/ojasmine.cma 
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/META 

Poi, ho cd al mio progetto tournabox e cercare di costruire la suite di test:

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 

questo viene a mancare con l'errore:

Error: Error while linking test_tournabox.cmo: 
Reference to undefined global `Ojasmine' 

Sembra che ojasmine.cma non sia collegato all'eseguibile test_tournabox.byte. Ma mi aspetterei che l'argomento -linkpkg di ocamlfind organizzi questo. Cosa mi manca?

Edit: Ecco il file META:

description = "Unit Tests for javascript" 
requires = "js_of_ocaml,js_of_ocaml.syntax" 
version = "0.1" 

Ecco ocamlobjinfo:

trusty)[email protected]:~/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 vede:

(trusty)[email protected]:~/ocaml/ojasmine$ ocamlfind query ojasmine 
/home/laheadle/.opam/4.02.0/lib/ojasmine 

qui è:

(trusty)[email protected]:~/ocaml/ojasmine$ ls `ocamlfind query ojasmine` 
META ojasmine.cma 

Ecco 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; |] 

E 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 
+1

Potete fornire l'output di 'ocamlobjinfo', indirizzato su' ojasmine.cma'? – ivg

+1

Il pacchetto viene visualizzato sotto ocamlfind query/list? puoi caricare il CMA nel livello più alto con ocamlfind? – nlucaroni

+1

Uno sguardo al file META potrebbe aiutare. Forse non fornisce le buone informazioni di collegamento. – PatJ

risposta

3

Il file META dovrebbe contenere una variabile archive, in modo che possa correttamente ocamlfind collegare il programma con l'archivio, non file oggetto. Inoltre è necessario installare i file cmi. (E, anche se non è necessario per la compilazione, ma è un buon modo per installare i file mli). Quindi, aggiungere il seguente al vostro META

archive(byte) = "ojasmine.cma" 

E non dimenticare di installare cmi.

Problemi correlati