12.2 Runtimes and Foreign Code
Some applications may need to use the foreign language interface. Object code is by definition machine-dependent and thus cannot be part of the saved program file.
To complicate the matter even further there are various ways of loading foreign code:
- Using the library(shlib) predicates
This is the preferred way of dealing with foreign code. It loads quickly and ensures an acceptable level of independence between the versions of the emulator and the foreign code loaded. It works on Unix machines supporting shared libraries and library functions to load them. Most modern Unixes, as well as Win32 (Windows 95/NT), satisfy this constraint. - Static linking
This mechanism works on all machines, but generally requires the same C compiler and linker to be used for the external code as is used to build SWI-Prolog itself.
To make a runtime executable that can run on multiple platforms one
must make runtime checks to find the correct way of linking. Suppose we
have a source file myextension.c
defining the installation
function install().
If this file is compiled into a shared library, load_foreign_library/1 will load this library and call the installation function to initialise the foreign code. If it is loaded as a static extension, define install() as the predicate install/0 :
static foreign_t pl_install() { install(); PL_succeed; } PL_extension PL_extensions [] = { /*{ "name", arity, function, PL_FA_<flags> },*/ { "install", 0, pl_install, 0 }, { NULL, 0, NULL, 0 } /* terminating line */ };
Now, use the following Prolog code to load the foreign library:
load_foreign_extensions :- current_predicate(install, install), !, % static loaded install. load_foreign_extensions :- % shared library load_foreign_library(foreign(myextension)). :- initialization load_foreign_extensions.
The path alias foreign
is defined by file_search_path/2.
By default it searches the directories <home>/lib/<arch>
and
<home>/lib
. The application can specify
additional rules for
file_search_path/2.