Ocamlopt is the native code compiler for the OCaml programming language. It translates OCaml source code directly into efficient machine code, allowing for high-performance applications. This guide provides essential command-line examples for using ocamlopt effectively.
The most basic usage of ocamlopt is to compile a single OCaml source file into an executable. The -o flag specifies the output filename.
# Compile an OCaml source file to a native executable
ocamlopt -o my_program my_program.ml
To aid in debugging, you can include debugging symbols in the compiled executable using the -g flag. This allows debuggers like GDB to map machine code back to your OCaml source lines.
# Include debugging information in the compiled program
ocamlopt -g -o my_program_debug my_program.ml
ocamlopt supports various optimization levels to improve the performance of your compiled code. The -O flag followed by a number (e.g., -O3) enables these optimizations. Higher numbers generally mean more aggressive optimization, potentially at the cost of longer compilation times.
# Enable optimization level 3 for potentially faster code
ocamlopt -O3 -o my_program_optimized my_program.ml
For larger projects, you'll often split your code into multiple modules. You can compile each module separately using the -c flag (which compiles without linking) and then link them together to form the final executable. The .cmx files are the compiled native interface files.
# Compile separate modules and link them into a single executable
ocamlopt -c module1.ml
ocamlopt -c module2.ml
ocamlopt -o my_program module1.cmx module2.cmx
OCaml integrates well with C. You can link your OCaml program against external C libraries using the -cclib flag, followed by the library name (prefixed with -l).
# Link with an external C library
ocamlopt -cclib -lmyclibrary -o my_program my_program.ml
Sometimes, it's useful to inspect the generated assembly code for performance analysis or understanding. The -S flag tells ocamlopt to output assembly code instead of an executable.
# Generate assembly code instead of an executable
ocamlopt -S -o my_program.s my_program.ml
When your project depends on modules or libraries not in the default search path, you can specify additional directories using the -I flag. This helps the compiler find compiled interface files (.cmi) and object files (.cmx).
# Include a custom search path for finding compiled interface files
ocamlopt -I /path/to/dir -o my_program my_program.ml
To analyze the runtime performance of your application, you can generate a profiling-enabled executable using the -p flag. This allows you to use profiling tools to identify performance bottlenecks.
# Produce a profiling-enabled executable
ocamlopt -p -o my_program_prof my_program.ml
You can directly link precompiled C object files (.o) with your OCaml code. This is useful when you have C code that has already been compiled into object files.
# Link against a precompiled C object file
ocamlopt my_program.ml my_c_function.o -o my_program_with_c
For detailed insights into the compilation process, including the various stages and commands executed by ocamlopt, use the -verbose flag.
# Output a list of intermediate compilation steps
ocamlopt -verbose -o my_program_verbose my_program.ml