# 11.4. Dynamically loading `libmpi` at runtime

If you want to explicitly load Open MPI’s shared library `libmpi` at runtime by using `dlopen()` from C/C ++ or something like the `ctypes` package from Python, extra care is required. The default configuration of Open MPI uses `dlopen()` internally to load its support components. These components rely on symbols available in `libmpi`. In order to make the symbols in `libmpi` available to the components loaded by Open MPI at runtime, your application must load `libmpi` with the `RTLD_GLOBAL` option.

In C/C++, this option is specified as the second parameter to the POSIX `dlopen(3)` function.

When using `ctypes` with Python, this can be done with the second (optional) parameter to `CDLL()`. For example (shown below in Mac OS X, where Open MPI’s shared library name ends in `.dylib`; other operating systems use other suffixes, such as `.so`):

    from ctypes import *

    mpi = CDLL('libmpi.0.dylib', RTLD_GLOBAL)

    f = pythonapi.Py_GetArgcArgv
    argc = c_int()
    argv = POINTER(c_char_p)()
    f(byref(argc), byref(argv))
    mpi.MPI_Init(byref(argc), byref(argv))

    # Your MPI program here

    mpi.MPI_Finalize()

Note

The above is just an example showing dynamic loading. If you want to use MPI in Python, you are much better off using MPI4Py.

Other scripting languages should have similar options when dynamically loading shared libraries.