12.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 12.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.