Beginning with OCaml 3.00, the compiler itself has an interesting feature called "automatic linking" that makes the following mechanism superflous in most cases. Automatic linking means that it is possible to store the linker options into the cma or cmxa file such that the compiler itself knows which options are necessary. Of course, the following mechanism still works, and it is still helpful when conditional linking is required.
OCaml has a C interface which means that C libraries can be linked in and C functions can be declared as new language primitives. Using such libraries requires special linker options. Some of the core libraries distributed with OCaml are partly implemented in C and thus additional libraries must be specified in the linking phase of the program.
For example, the "str" library providing regular expressions requires to be linked as follows:
ocamlc -o prog str.cma my_file1.cmo my_file2.cmo -cclib -lstr
The -cclib option passes the following argument directly to the underlying C linker which has the effect that libstr.a is linked in, too. The "-cclib -lstr" is directly associated with str.cma as the latter simply cannot be used without the former. Assume you would write a META file describing str. That "str.cma" should be linked in as archive is clear; the "-cclib -lstr" can be specified in another variable called "linkopts". The META file would look like:
requires = "" version = "str from ocaml 2.02" archive(byte) = "str.cma" archive(native) = "str.cmxa" linkopts = "-cclib -lstr"
This has the effect that specifying -linkpkg in one of the compiler frontends not only chooses one of the archive files, but also extracts the necessary linker options from the META file. The above example can also be compiled with:
ocamlfind ocamlc -o prog -package str -linkpkg my_file1.cmo my_file2.cmo
Most people will never write META files with "linkopts" settings. But this feature is very useful at least for the core libraries such as str. Because of this, the "findlib" distribution comes with META files for the core libraries in order to hide the linker options. This means that you can already use the packages "str", "dbm", "dynlink", "graphics", "num", "threads", "unix", and "camltk", and that the appropriate archives and linker options are automatically extracted.