dyn.load {base} | R Documentation |
Load or unload DLLs (also known as shared objects), and test whether a C function or Fortran subroutine is available.
dyn.load(x, local = TRUE, now = TRUE, ...) dyn.unload(x) is.loaded(symbol, PACKAGE = "", type = "")
x |
a character string giving the pathname to a DLL, also known as a dynamic shared object. (See ‘Details’ for what these terms mean.) |
local |
a logical value controlling whether the symbols in the DLL are stored in their own local table and not shared across DLLs, or added to the global symbol table. Whether this has any effect is system-dependent. It is ignored on Windows. |
now |
a logical controlling whether all symbols are resolved (and relocated) immediately the library is loaded or deferred until they are used. This control is useful for developers testing whether a library is complete and has all the necessary symbols, and for users to ignore missing symbols. Whether this has any effect is system-dependent. It is ignored on Windows. |
... |
other arguments for future expansion. See section ‘Windows’ below. |
symbol |
a character string giving a symbol name. |
PACKAGE |
if supplied, confine the search for the |
type |
The type of symbol to look for: can be any ( |
The objects dyn.load
loads are called ‘dynamically
loadable libraries’ (abbreviated to ‘DLL’ on all platforms
except Mac OS X, which unfortunately uses the term for a different
sort of sobject. On Unix-alikes they are also called ‘dynamic
shared objects’ (‘DSO’), or ‘shared objects’ for
short. (The POSIX standards use ‘executable object file’, but
no one else does.)
See ‘See Also’ and the ‘Writing R Extensions’ and ‘R Installation and Administration’ manuals for how to create and install a suitable DLL.
Unfortunately a very few platforms (e.g. Compaq Tru64) do not handle
the PACKAGE
argument correctly, and may incorrectly find
symbols linked into R.
The additional arguments to dyn.load
mirror the different
aspects of the mode argument to the dlopen()
routine on POSIX
systems. They are available so that users can exercise greater control
over the loading process for an individual library. In general, the
default values are appropriate and you should override them only if
there is good reason and you understand the implications.
External code must not change the floating point control word, but
many DLLs do so. Common changes are to set it to use 53 bit
precision instead of R's default 64 bit precision, or to unmask
some exceptions. dyn.load
detects such changes,
and restores R's control word to its default value of hex 8001F.
This may cause the DLL to malfunction; if so, it should be rewritten
to save and restore the control word itself. If warn.FPU
is set to TRUE
using the options
function,
a warning will be printed. (If the warning says
that the control word was changed from some other value than 8001F,
please report the circumstances to the Windows maintainers:
that probably indicates an internal bug.)
The function dyn.load
is used for its side effect which links
the specified DLL to the executing R image. Calls to .C
,
.Call
, .Fortran
and .External
can then be used to
execute compiled C functions or Fortran subroutines contained in the
library. The return value of dyn.load
is an object of class
DLLInfo
. See getLoadedDLLs
for information about
this class.
The function dyn.unload
unlinks the DLL. Note that unloading a
DLL and then re-loading a DLL of the same name may or may not work: on
Solaris it uses the first version loaded.
is.loaded
checks if the symbol name is loaded and hence
available for use in .C
or .Fortran
or .Call
or
.External
. It will succeed if any one of the four calling
functions would succeed in using the entry point unless type
is
specified. (See .Fortran
for how Fortran symbols are
mapped.)
The ‘standard mechanisms for loading DLLs’ include a search order for where a DLL is found (if not given as an absolute path, which is preferred), and of where its dependent DLLs will be found. This search path depends on the version of Windows and its security settings, but for versions since Windows XP SP1 it is
The directory from which the application was launched.
The various system directories, e.g. ‘c:/Windows/system32’, ‘c:/Windows/system’ and ‘c:/Windows’.
The current directory.
Along the search path for executables given by the environment variable PATH.
Packages often want to supply dependent DLLs in their ‘libs’
directory, and do this by setting the PATH variable
(library.dynam
does that automatically in recent
versions of R), but the DLL search order means that DLLs in the
launch directory and in system directories will be preferred. On
Windows XP SP1 and later there is a way to modify the search order.
If argument DLLpath
is supplied to dyn.load
, the latter
makes use of the Windows system call SetDllDirectory
to insert
the value of DLLpath
in second place, and removes the current
directory, for the duration of that dyn.load
call. (Note that
only one directory can be inserted in this way.) On Windows 2000, the
second item in the search order is the current directory, and the
current directory is changed temporarily to implement DLLpath
.
Do not use dyn.unload
on a DLL loaded by
library.dynam
: use library.dynam.unload
.
This is needed for system housekeeping.
is.loaded
requires the name you would give to .C
etc
and not (as in S) that remapped by defunct functions
symbol.C
or symbol.For
.
The creation of DLLs and the runtime linking of them into executing
programs is very platform dependent. In recent years there has been
some simplification in the process because the C subroutine call
dlopen
has become the POSIX standard for doing this. Under
Unix-alikes dyn.load
uses the dlopen
mechanism and
should work on all platforms which support it. On Windows it uses the
standard mechanism (LoadLibrary
) for loading DLLs.
The original code for loading DLLs in Unix-alikes was provided by Heiner Schwarte.
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
library.dynam
to be used inside a package's
.onLoad
initialization.
SHLIB
for how to create suitable DLLs.
.C
,
.Fortran
,
.External
,
.Call
.
is.loaded("hcass2") #-> probably TRUE, as stats is loaded is.loaded("supsmu") # Fortran entry point in stats is.loaded("supsmu", "stats", "Fortran") is.loaded("PDF", type = "External")