问题
Having successfully reorganized my project for ocamlbuild with subdirectories and using ocamlfind, I've found it difficult to build the top-level.
I've constructed a .mltop
file containing all the modules that would be included and added the packages to the _tags
, but the build doesn't work. It cannot find the C functions that are compiled with one of the modules. With -classic-display
on, I can see that file, libcside.a
, not being included and isn't even being compiled at all! The c file is added as a dependency in myocamlbuild.ml
by,
flag ["link"; "ocaml"; "use_cutil"] (S [A"-cclib"; A"-L."; ]);
dep ["link"; "ocaml"; "use_cutil"] ["libcside.a"];
and in _tags
,
<utilities.*> : use_cutil
<**/*.top> : use_str, use_unix, use_cutil, use_curl, use_mysql
and, finally, in libcside.clib
,
cutil.o
I'm missing something in setting up the build for the top level, but I cannot find a reliable resource online. Thanks.
回答1:
- I presume that cutil.ml describes ocaml side of libcside.a - correct?
- Did you put Cutil in mltop?
- With your current plugin cutil ocaml library will not link libcside.a in (
dep
only instructs ocamlbuild to build it, not link) Here is a simple (and working) way to build project-local ocaml library with C stubs. In myocamlbuild.ml:
ocaml_lib "linuxnet"; let liblinuxnet_stubs = "liblinuxnet_stubs." ^ !Options.ext_lib in flag ["link"; "ocaml"; "use_linuxnet"] (S[A"-cclib"; A liblinuxnet_stubs;]); dep ["link"; "ocaml"; "use_linuxnet"] [liblinuxnet_stubs];
In liblinuxnet_stubs.clib:
linuxnet_c.o
Notice that the C source is called
linuxnet_c.c
so that the resulting object file doesn't override the one from linuxnet.ml (or vice versa). And finally in _tags:true: use_linuxnet
With this setup it will be available in toplevel (note that there is no need to put
Linuxnet
into .mltop cause linuxnet.cma will be added to link byuse_linuxnet
flag (generated withocaml_lib
usage)).
来源:https://stackoverflow.com/questions/2374136/ocamlbuild-building-toplevel