11.2.5 Static Linking
Below is an outline of the file structure required for statically 
linking SWI-Prolog with foreign extensions. .../swipl 
refers to the SWI-Prolog home directory (see the Prolog flag home).
<arch> refers to the architecture 
identifier that may be obtained using the Prolog flag arch.
.../swipl/runtime/<arch>/libswipl.a  | SWI-Library | 
.../swipl/include/SWI-Prolog.h  | Include file | 
.../swipl/include/SWI-Stream.h  | Stream I/O include file | 
.../swipl/include/SWI-Exports  | Export declarations (AIX only) | 
.../swipl/include/stub.c  | Extension stub | 
The definition of the foreign predicates is the same as for dynamic 
linking. Unlike with dynamic linking, however, there is no 
initialisation function. Instead, the file .../swipl/include/stub.c 
may be copied to your project and modified to define the foreign 
extensions. Below is stub.c, modified to link the lowercase 
example described later in this chapter:
#include <stdio.h>
#include <SWI-Prolog.h>
extern foreign_t pl_lowercase(term, term);
PL_extension predicates[] =
{
/*{ "name",      arity,  function,      PL_FA_<flags> },*/
  { "lowercase", 2       pl_lowercase,  0 },
  { NULL,        0,      NULL,          0 } /* terminating line */
};
int
main(int argc, char **argv)
{ PL_register_extensions(predicates);
  if ( !PL_initialise(argc, argv) )
    PL_halt(1);
  PL_halt(PL_toplevel() ? 0 : 1);
}
Now, a new executable may be created by compiling this file and 
linking it to libpl.a from the runtime directory and the 
libraries required by both the extensions and the SWI-Prolog kernel. 
This may be done by hand, or by using the swipl-ld utility 
described in
section 11.5. If the 
linking is performed by hand, the command line option -dump-runtime-variables 
(see section 2.4) can be 
used to obtain the required paths, libraries and linking options to link 
the new executable.