12.2 Linking Foreign Modules
AllApplicationManualNameSummaryHelp

  • Documentation
    • Reference manual
      • Foreign Language Interface
        • Linking Foreign Modules
          • What linking is provided?
          • What kind of loading should I be using?
          • library(shlib): Utility library for loading foreign objects (DLLs, shared objects)
          • Low-level operations on shared libraries
          • Static Linking
    • Packages

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.