Thanks, I didn't realise that. Replacing Puz_plugin.read with Puz.read compiled, but didn't link: + ocamlfind ocamlopt -linkpkg -g -thread -package core_kernel plugins/puz/puz_types.cmx plugins/puz/puz_utils.cmx plugins/puz/puz_bin.cmx plugins/puz/puz_match.cmx types.cmx xword.cmx plugins/puz/puz.cmx file.cmx -o file.native File "_none_", line 1: Error: No implementations provided for the following modules: Bitstring referenced from plugins/puz/puz_bin.cmx Run_mikmatch_pcre referenced from plugins/puz/puz_match.cmx Str referenced from plugins/puz/puz.cmx Pcre referenced from plugins/puz/puz_match.cmx Command exited with code 2. I don't (yet) need dynamic linking; my current main aim with the .mllib setup is to specify the package dependencies for each plugin in its own section of the _tags file, and not have a long list of every plugin's dependencies in the main module. martin On Mon, Sep 21, 2015 at 11:45 PM, Gabriel Scherer wrote: > A .cma or .cmxa archive does not pack its sub-modules under a common > module name: the module name Puz_plugin that you use does not refer to > anything. Accessing any of the constituent modules directly (eg. > Puz_match.foo) should work -- although it may not go through the .cmxa > but directly refer to the compilation unit. > > Note that if "_plugin" is intended to refer to dynamic linking, you > may want to use a .mldylib file instead of .mllib, to be used to > generate a .cmxs file: .cmxa is not suitable for dynamic linking > (while, at the bytecode level, .cma work for both static and dynamic > linking). > > On Tue, Sep 22, 2015 at 8:23 AM, Martin DeMello > wrote: > > If I have my project set up like this: > > > > . > > ├── file.ml > > ├── plugins > > │ └── puz > > │ ├── puz_bin.ml > > │ ├── puz_match.ml > > │ ├── puz.ml > > │ ├── puz_plugin.mllib > > │ ├── puz_types.ml > > │ └── puz_utils.ml > > └── _tags > > > > $ cat plugins/puz/puz_plugin.mllib > > Puz Puz_bin Puz_match > > > > This works: > > > > $ ocamlbuild -use-ocamlfind plugins/puz/puz_plugin.cmxa > > Finished, 22 targets (3 cached) in 00:00:03. > > > > My _tags file: > > ------------------------------------------------ > > $ cat _tags > > true: thread,debug > > true: package(core_kernel) > > > > "plugins/puz": include > > > > : package(labltk) > > <**/puz.*>: package(unix), package(str), package(core_kernel), > > package(bitstring), package(mikmatch_pcre) > > <**/*_bin.*>: package(bitstring.syntax), syntax(bitstring) > > <**/*_match.*>: package(mikmatch_pcre), syntax(camlp4o) > > ------------------------------------------------ > > > > But I can't figure out how to use this library in my main program. This > is a > > minimal example of what I'm trying to do, not working of course: > > > > $ cat file.ml > > open Core_kernel.Std > > > > let read fname = > > let data = In_channel.read_all fname in > > Puz_plugin.read data > > > > $ ocamlbuild -use-ocamlfind file.native > > + ocamlfind ocamlc -c -g -thread -package core_kernel -I plugins/puz -o > > file.cmo file.ml > > File "file.ml", line 5, characters 2-17: > > Error: Unbound module Puz_plugin > > > > martin >