% File src/library/utils/man/SHLIB.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2013 R Core Team
% Distributed under GPL 2 or later

\name{SHLIB}
\alias{SHLIB}
\title{Build Shared Object/DLL for Dynamic Loading}
\description{
  Compile the given source files and then link all specified object
  files into a shared object aka DLL which can be loaded into \R using
  \code{dyn.load} or \code{library.dynam}.
}
\usage{
\special{R CMD SHLIB [options] [-o dllname] files}
}
\arguments{
  \item{files}{a list specifying the object files to be included in the
    shared object/DLL.  You can also include the name of source files (for
    which the object files are automagically made from their sources)
    and library linking commands.
  }
  \item{dllname}{the full name of the shared object/DLL to be built,
    including the extension (typically \file{.so} on Unix systems, and
    \file{.dll} on Windows).  If not given, the basename of the object/DLL
    is taken from the basename of the first file.}
  \item{options}{Further options to control the processing.  Use
    \command{R CMD SHLIB --help} for a current list.
#ifdef windows
    The most useful one on Windows is \code{-d} to build a debug DLL.
#endif
  }
}
\details{
  \command{R CMD SHLIB} is the mechanism used by \code{\link{INSTALL}} to
  compile source code in packages.  It will generate suitable
  compilation commands for C, C++, Objective C(++) and Fortran sources: Fortran
  90/95 sources can also be used but it may not be possible to mix these
  with other languages (on most platforms it is possible to mix with C,
  but mixing with C++ rarely works).

  Please consult section \sQuote{Creating shared objects} in the manual
  \sQuote{Writing R Extensions} for how to customize it (for example to
  add \code{cpp} flags and to add libraries to the link step) and for
  details of some of its quirks.

  Items in \code{files} with extensions \file{.c}, \file{.cpp},
  \file{.cc}, \file{.C}, \file{.f}, \file{.f90}, \file{.f95}, \file{.m}
  (Objective-C), \file{.M} and \file{.mm} (Objective-C++) are regarded as source
  files, and those with extension \file{.o} as object files.  All other
  items are passed to the linker.

  Objective C(++) support is optional when \R was configured: their main
  usage is on macOS.

  Note that the appropriate run-time libraries will be used when linking
  if C++, Fortran or Objective C(++) sources are supplied, but not for
  compiled object files from these languages.

  Option \option{-n} (also known as \option{--dry-run}) will show the
  commands that would be run without actually executing them.
#ifdef windows

  If there is an exports file \file{dllname-win.def} in the current
  directory it will be used, otherwise all entry points in object files
  (but not libraries) will be exported from the DLL.
#endif
}
#ifdef unix
\note{
  Some binary distributions of \R have \code{SHLIB} in a separate
  bundle, e.g., an \code{R-devel} RPM.
}
#endif
\seealso{
#ifdef unix
  \code{\link{COMPILE}},
#endif
  \code{\link{dyn.load}}, \code{\link{library.dynam}}.

  The \sQuote{R Installation and Administration} and
  \sQuote{Writing R Extensions} manuals, including the section on
  \sQuote{Customizing package compilation} in the former.
}
#ifdef unix
\examples{\dontrun{
# To link against a library not on the system library paths:
R CMD SHLIB -o mylib.so a.f b.f -L/opt/acml3.5.0/gnu64/lib -lacml
}}
#endif
#ifdef windows
\examples{\dontrun{
# To link against a library not on the system library paths:
Rcmd SHLIB -o my.dll a.f b.f -L/AMD/acml3.5.0/gnu32/lib -lacml
}}
#endif
\keyword{utilities}
